我有一个日期,我正在以下列格式从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
为什么显示为前一天?上面的格式有名称吗?
答案 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。