我正在制作提醒申请表。应用程序将提醒Date,Time和DateLastShown(在不同的字段中)存储在数据库中,并将它们拉出来执行检查。
所有日期均为“d / MM / yyyy”格式。我的问题是,当我从数据库中提取日期并尝试存储回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表。
答案 0 :(得分:4)
如果解析到日期对象没有错误输出,那么当您致电.ToString().
时,您的输出就会出现问题来自文档:
ToString方法返回日期和的字符串表示形式 在当前文化使用的日历中的时间。
如果您需要的不是用户当前的区域性设置,您可以在重载的ToString()方法中使用格式字符串指定:
var reminderDate = DateTime.ParseExact("24/01/2013", "d/MM/yyyy", null);
MessageBox.Show(reminderDate.ToString("d/MM/yyyy"));
此外,正如其他人在评论中所述,如果可能,您应该在数据库中使用日期数据类型,而不是将值存储为字符串。