0

私はリマインダーアプリケーションに取り組んでいます。アプリケーションは、リマインダーの Date、Time、および DateLastShown を (異なるフィールドに) データベースに保存し、それらを取り出してチェックを実行します。

すべての日付は「d/MM/yyyy」形式です。私の問題は、DB から日付を取得して DateTime 形式に戻そうとすると、「M/d/yyyy」形式で表示されていることです。これは、アプリが必要とする方法ではありません。

基本的に、DB から値を取得し、いくつかのチェックを行って、リマインダーを表示する時期かどうかを判断する必要があります。かなり簡単に思えますが、小さなエラーを犯している可能性があります。

以下はコメント付きの私のコードです。どんな助けでも本当に感謝しています。

public void CheckReminders()
    {
        IQueryable<Reminder> reminders;
        DateTime reminderDate;
        DateTime reminderTime;
        DateTime reminderLastShown;
        DateTime todayDate;
        DateTime timeNow;            

        while (true)
        {
            try
            {
                db = new StudioManagementEntities();
                reminders = from r in db.Reminders
                            select r;

                foreach (Reminder r in reminders)
                {
                    if (r.Enabled == 1)
                    {
                        if (r.Recurring == 1)
                        {                              
                            // This is the code i was using before when the date was   in "M/d/yyyy" format
                            // which seems to be default.
                            reminderTime = DateTime.Parse(r.Time);
                            timeNow = DateTime.Parse(DateTime.Now.ToLongTimeString());

                            if (r.DateLastShown != DateTime.Today.ToShortDateString() && timeNow >= reminderTime)
                            {
                                FrmReminder frmReminder = new FrmReminder(r.Id, true);
                                frmReminder.ShowDialog();
                                r.DateLastShown = DateTime.Today.ToShortDateString();                                                                   
                            }
                        }
                        else
                        {
                            // Now i need to pass in "d/M/yyyy" format but the 
                            // code seems to return in "M/d/yyyy" format.    

                            reminderDate = DateTime.ParseExact(r.Date, "d/MM/yyyy", null);  
                            // Even this returns in wrong format
                            reminderDate = DateTime.ParseExact("24/01/2013", "d/MM/yyyy", null);                        
                            // Have tried with CultureInfo.InvariantCulture too.
                            MessageBox.Show(reminderDate.ToString());

                            return;

                            if (
                                r.DateLastShown != DateTime.Today.Date.ToShortDateString() //&&
                                //r.Date == DateTime.ParseExact(DateTime.Today, "d/MM/yyyy", CultureInfo.InvariantCulture).ToString() //&&
                                //now.TimeOfDay.TotalSeconds >= reminderTime.TimeOfDay.TotalSeconds
                               )
                            {
                                FrmReminder frmReminder = new FrmReminder(r.Id, true);
                                frmReminder.ShowDialog();
                                r.DateLastShown = DateTime.Today.ToShortDateString();                                                      
                            }
                        }                            
                    }                        
                }

                db.SaveChanges();
            }              
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

            // Check every minute
            Thread.Sleep(60000);   
        }
    }

そしてDBテーブル。 ここに画像の説明を入力

4

1 に答える 1

3

日付オブジェクトへの解析でエラーが発生しない場合は、.ToString() を呼び出したときに出力に問題があるだけです。

ドキュメントから:

ToString メソッドは、現在のカルチャで使用されているカレンダーの日付と時刻の文字列表現を返します。

ユーザーの現在のカルチャ設定以外のものが必要な場合は、オーバーロードされたToString()メソッドでフォーマット文字列を使用して指定できます。

   var reminderDate = DateTime.ParseExact("24/01/2013", "d/MM/yyyy", null);

   MessageBox.Show(reminderDate.ToString("d/MM/yyyy"));

また、他の人がコメントで述べているように、可能であれば、値を文字列として保存するのではなく、データベースで日付データ型を使用する必要があります。

于 2013-11-15T01:10:06.423 に答える