C# 如何储存我的日期?

C# 如何储存我的日期?,c#,sql-server,datetime,utc,C#,Sql Server,Datetime,Utc,我对Utc日期没有太多经验,但据我所知,在大多数情况下,Utc日期是存储日期的最佳方式 但我目前正在做一个程序,我怀疑什么是存储日期的最佳方式。在该计划中,用户可以从注册之日开始,为期五周的课程。他每天都要填写一张表格,这张表格是为那天保存的 目前,我正在将课程的开始日期和结束日期保存为日期时间(无Utc)。我应该将其保存为Utc,还是不需要?因为我只需要这一天(如果用户在2月8日10:04注册,系统需要知道的是2月8日是课程的第一天。是否有更好的方法存储此信息?保存系统事件日期(如用户登录、创

我对Utc日期没有太多经验,但据我所知,在大多数情况下,Utc日期是存储日期的最佳方式

但我目前正在做一个程序,我怀疑什么是存储日期的最佳方式。在该计划中,用户可以从注册之日开始,为期五周的课程。他每天都要填写一张表格,这张表格是为那天保存的

目前,我正在将课程的
开始日期
结束日期
保存为
日期时间
(无Utc)。我应该将其保存为Utc,还是不需要?因为我只需要这一天(如果用户在2月8日10:04注册,系统需要知道的是2月8日是课程的第一天。是否有更好的方法存储此信息?保存系统事件日期(如用户登录、创建帐户等)的最佳方法是什么

我过去还使用
日期时间
存储表单数据,以计算表单提交的日期,但我更改了它,使其仅保存相对的日期(例如第5天)


顺便说一句,我使用的是C#和SQL Server数据库。

为什么不把日期存储在
日期
数据库列中,而不用担心时区呢?

为什么不把日期存储在
日期
数据库列中,而不用担心时区呢?

如果您所担心的只是日期组件&时区/位置不重要,您可以将其作为
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
DateTime dt=DateTime.Now;
dt.Date;//UTC(协调世界时)与日期的时间部分有关。这是存储日期时间的标准方法,因此您可以进行比较,而无需担心时区

如果您所担心的只是日期组件&时区/位置不重要,您可以将其作为
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
DateTime dt=DateTime.Now;

dt.Date;//如果您的系统在功能上要求能够与不同时区的用户一起工作,通常您希望存储在UTC中

香港有一个用户和悉尼的一个用户在看同一个事件。如果你想让他们都看到他们的时区中的事件日期(和时间),那么在这里,你可能需要把它存储在UTC中,然后向用户展示他们的地理位置。

如果您没有这样的要求,您不需要进行这样的转换,并且您只假设一个时区,那么您不需要在系统中增加更多的复杂性,只需使用Date列并将当前日期存储在那里

但如果你这样做了-选择UTC。在这种情况下,你将需要DateTime,而不仅仅是Date。这是因为一个时区的21:30可能是另一个时区的第二天2:30,所以时间真的很重要

当向用户显示时,您可以将其转换为用户的时区,然后丢弃时间,但为了使转换正确,您需要保留时间

在.NET中使用UTC很容易,DateTime具有.ToUniversalTime()方法,可将DateTime值转换为UTC:

var utcNow = DateTime.Now.ToUniversalTime();
还有一个属性:

var utcNow = DateTime.UtcNow;
已编辑

使用TimeZoneInfo静态类将日期时间从/转换为所需的时区(例如,从UTC转换为指定用户的时区:

TimeZoneInfo.ConvertTimeToUtc(...)
TimeZoneInfo.ConvertTimeFromUtc(...)

通常,如果您的系统需要能够与不同时区的用户一起工作,那么您希望存储在UTC中

香港有一个用户和悉尼的一个用户在看同一个事件。如果你想让他们都看到他们的时区中的事件日期(和时间),那么在这里,你可能需要把它存储在UTC中,然后向用户展示他们的地理位置。

如果您没有这样的要求,您不需要进行这样的转换,并且您只假设一个时区,那么您不需要在系统中增加更多的复杂性,只需使用Date列并将当前日期存储在那里

但如果你这样做了-选择UTC。在这种情况下,你将需要DateTime,而不仅仅是Date。这是因为一个时区的21:30可能是另一个时区的第二天2:30,所以时间真的很重要

当向用户显示时,您可以将其转换为用户的时区,然后丢弃时间,但为了使转换正确,您需要保留时间

在.NET中使用UTC很容易,DateTime具有.ToUniversalTime()方法,可将DateTime值转换为UTC:

var utcNow = DateTime.Now.ToUniversalTime();
还有一个属性:

var utcNow = DateTime.UtcNow;
已编辑

使用TimeZoneInfo静态类将日期时间从/转换为所需的时区(例如,从UTC转换为指定用户的时区:

TimeZoneInfo.ConvertTimeToUtc(...)
TimeZoneInfo.ConvertTimeFromUtc(...)

使用UTC。这是最好的,这样你就知道它在哪个时区(更快)您使用的是哪个版本的SQL Server?SQL Server 2008引入了新的日期相关类型,如
DATETIMEOFFSET
,这是一个日期,包括我使用2008年的时区信息。我将查看DATETIMEOFFSET。使用UTC。最好让您知道它位于哪个时区(更快)您使用的是哪个版本的SQL Server?SQL Server 2008引入了新的日期相关类型,如
DATETIMEOFFSET
,这是一个日期,包括我使用2008年的时区信息。我将查看DATETIMEOFFSET。谢谢,听起来像我需要的。谢谢,听起来像我需要的。