0

我正在开发一个提醒应用程序。应用程序将提醒日期、时间和 DateLastShown(在不同的字段中)存储在数据库中,并将它们拉出以执行检查。

所有日期均采用“d/MM/yyyy”格式。我的问题是,当我从数据库中提取日期并尝试将日期存储回 DateTime 格式时,它们仍然以“M/d/yyyy”格式显示,这不是应用程序需要的格式。

我基本上需要从数据库中提取值做一些检查以确定是否是时候显示提醒并这样做。这似乎很简单,也许我犯了一些小错误。

下面是我的带有注释的代码。任何帮助都非常感谢。

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);   
        }
    }

和数据库表。 在此处输入图像描述

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 回答