我对Utc Dates没有多少经验,但据我所知,在大多数情况下,它们是存储日期的最佳方式。
但我目前正在制作一个节目,我怀疑什么是存储我约会的最佳方式。在该计划中,用户可以在注册当天开始学习五个星期的课程。他每天都必须填写一份表格,该表格会在当天保存。
目前,我正在将课程的StartDate
和EndDate
保存为DateTime
(没有Utc)我应该将其保存为Utc,还是不是必要的?因为我只需要一天(如果用户在2月8日10:04注册,所有系统需要知道的是2月8日是课程的第一天。是否有更好的方法来存储这些信息?什么是保存系统事件日期的最佳方式(如用户登录,帐户创建等)?
我曾经用DateTime
存储表单数据,以计算它提交的日期,但我更改了它,因此它只保存相对的日期数(例如第5天)。
顺便说一下,我正在使用C#和SQL Server数据库。
答案 0 :(得分:2)
UTC(协调世界时)与日期的时间成分有关。这是存储DateTimes的标准方法,因此您可以进行比较而无需担心时区。
如果你担心的只是日期组件&时区/位置并不重要,您可以将其作为2012-02-01 00:00:00
您可以使用
在.NET中获取仅限日期的组件System.DateTime.Today;
或者,如果您正在使用其他日期......
DateTime dt = DateTime.Now;
dt.Date; // <--- this will give the Date Component with the Time stripped back to 00:00:00
答案 1 :(得分:1)
为什么不将日期存储在DATE
数据库列中,而不用担心时区?
答案 2 :(得分:1)
如果您的系统有功能要求能够与不同时区的用户合作,通常您希望以UTC格式存储。
假设您在香港有一位用户,而悉尼的用户正在查看同一事件。如果你想让他们看到他们的时区中的事件日期(和时间),那么我们可能需要将它存储在UTC中,然后呈现给用户尊重他们的地理位置。
如果您没有此类要求,则不进行此类转换,并且您只假设一个时区,然后您不需要在系统中添加更多复杂性,只需使用日期列并将当前日期存储在那里。
但如果你这样做 - 去参加UTC。在这种情况下,您将需要DateTime,而不仅仅是Date。这是因为在一个时区的21:30可以在另一个时区2:30 ,所以时间真的很重要。
向用户展示时,您可以将其转换为用户的时区,然后将时间浪费掉,但为了使转换正确,您需要留出时间。
在.NET中使用UTC非常容易,DateTime有.ToUniversalTime()方法,可以为您将日期时间值转换为UTC:
var utcNow = DateTime.Now.ToUniversalTime();
还有一个属性:
var utcNow = DateTime.UtcNow;
<强> EDITED 强>
使用TimeZoneInfo静态类将日期时间转换为您需要的时区(例如从UTC到指定用户的时区:
TimeZoneInfo.ConvertTimeToUtc(...)
TimeZoneInfo.ConvertTimeFromUtc(...)