为什么.net将此日期解释为分配给日期字段的前一天?

时间:2010-03-04 03:53:32

标签: c# .net vb.net datetime

我有一个日期,我正在以下列格式从API中读取:

2010-03-15T00:00:00-04:00

在C#/ VB.net中分配日期数据类型时,它显示为:

3/14/2010 11:00:00 PM //Note 3/15 is being displayed as 3/14

为什么显示为前一天?上面的格式有名称吗?

3 个答案:

答案 0 :(得分:3)

您显示的日期位于UTC,而当您进行转换时,它调整了本地时区的DateTime实例。

您应该可以调用ToUniversalTime method以UTC格式获取日期。

如果您需要输入作为本地时区的文字的时间,则需要使用日期数据(年,月,日等等)或通过一系列调用来创建新的DateTime实例。 SpecifyKind method表示DateTime实例是用于本地时区还是UTC。

答案 1 :(得分:1)

夫妻问题在这里:

1)确保注意到原始字符串包含-04:00的时区偏移量,因此它不是UTC格式。同一时间点的UTC版本显然是2010-03-15T04:00:00Z(结尾Z表示UTC /祖鲁语)。然后,当您显示DateTime时,它会显示本地时区版本 - 因为您的本地时区是EST(-5),然后它显示在原始字符串中出现的前1小时(偏移@ -4),因此11:下午12点

2)听起来你的目标不是显示时间戳的本地时区或UTC版本,而是保持与输入字符串指定的偏移量相同的偏移量。幸运的是,为这种情况添加了一种类型:DateTimeOffset

如果您使用DateTimeOffset而不是DateTime,那么默认的ToString输出将是:

[342] C:\ » $dto = [datetimeoffset]::parse('2010-03-15T00:00:00-08:00')
[343] C:\ » $dto.ToString()
3/15/2010 12:00:00 AM -08:00
[344] C:\ » $dto.DateTime.ToString()
3/15/2010 12:00:00 AM

请注意,它保留了偏移的相同时间和知识(因此是类型的名称)。如果您不关心偏移量并且只想获取输入所在的任何偏移量的DateTime,您只需获取DateTime属性(如上所示)。如果您需要坚持使用DateTime而不能或不想切换到DateTimeOffset,这可能就是您的选择。

答案 2 :(得分:0)

这是一个时区问题。如果您使用的是.NET 3.5,则可以使用TimeZoneInfo类来处理可能有用的时区。在以前的.NET版本中,您必须使用不那么健壮的TimeZone。