我正在编写一个部署到Azure网站的MVC 5互联网应用程序。这个应用程序将在国际上使用,我想知道存储任何DateTime值是否应该使用UTC时间?
这是一个例子:我有一个具有开始日期时间值和结束日期时间值的对象。这些值由用户设置,用于确定是否应向用户显示数据。如果当前日期时间值介于开始日期时间和结束日期时间之间,则显示数据。
因为我的应用程序将在国际上使用,并且有不同的时区,我应该将开始日期时间值和结束日期时间值存储为具有UTC的DateTime对象,或者标准的DateTime值将是全部需要?我是否需要担心为不同的时区设置和显示DateTime值,还是将它合并到DateTime对象中?
提前致谢。
修改
编辑以UTC格式存储的DateTime时的情况。
如果我有一个在对象中存储为UTC的DateTime,并且用户想要更改此值,我是否需要将DateTime(显示为.ToLocalTime())转换回UTC DateTime在编辑后将此值存回数据库?
EDIT2
您能快速查看我编码的这些函数,以确保编码正确吗?
public DateTime ConvertUTCDateTimeToLocalTime(DateTime utcDateTime)
{
DateTime convertedDate = DateTime.SpecifyKind(utcDateTime, DateTimeKind.Utc);
return convertedDate.ToLocalTime();
}
public DateTime ConvertLocalDateTimeToUniversalTime(DateTime localDateTime)
{
DateTime convertedDate = DateTime.SpecifyKind(localDateTime, DateTimeKind.Local);
return convertedDate.ToUniversalTime();
}
public DateTime ConvertUTCDateTimeToLocalTime(string utcDateTime)
{
DateTime convertedDate = DateTime.SpecifyKind(DateTime.Parse(utcDateTime.ToString()), DateTimeKind.Utc);
return convertedDate.ToLocalTime();
}
public DateTime ConvertLocalDateTimeToUniversalTime(string localDateTime)
{
DateTime convertedDate = DateTime.SpecifyKind(DateTime.Parse(localDateTime.ToString()), DateTimeKind.Local);
return convertedDate.ToUniversalTime();
}
答案 0 :(得分:2)
通常,您应该在后端使用DateTime.UtcNow。第一个优点是您不必关心时区,其次,您不必对夏令时进行任何计算(请参阅this article中的更多内容)。 .NET为您提供了强大的功能,您无需太在意上述两点。另一方面,您不应该在前端显示UTC时间。这可能会惹恼您的用户,但这里有.NET的功能。如果您有UTC日期,您可以通过以下方式轻松地将当地时间转换为您的用户:
DateTime convertedDate = DateTime.SpecifyKind(
DateTime.Parse(dateStr),
DateTimeKind.Utc);
DateTime dt = convertedDate.ToLocalTime();
该片段取自this thread上的Drew Noakes答案,这是一个关于如何将日期转换为当地时间的精彩讨论。
修改强>
关于你的编辑:是的,你必须这样做。否则,日期将以当地时间存储。