Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.net应用程序中组合日期时间和时区偏移?_C#_Asp.net_Timezone - Fatal编程技术网

C# 如何在ASP.net应用程序中组合日期时间和时区偏移?

C# 如何在ASP.net应用程序中组合日期时间和时区偏移?,c#,asp.net,timezone,C#,Asp.net,Timezone,我对第三方应用程序的web服务调用返回日期、时区和时区偏移值。我需要将此添加到Asp.net应用程序中的日历中。什么是最好的方式将其结合在一起,以便我的日期对象理解它来自东部时区 <start_date>2014-11-17 19:00:00</start_date> <timezone>America/New_York</timezone> <timezone_offset>GMT-0500</timezone_offset&g

我对第三方应用程序的web服务调用返回日期、时区和时区偏移值。我需要将此添加到Asp.net应用程序中的日历中。什么是最好的方式将其结合在一起,以便我的日期对象理解它来自东部时区

<start_date>2014-11-17 19:00:00</start_date>
<timezone>America/New_York</timezone>
<timezone_offset>GMT-0500</timezone_offset>
2014-11-17 19:00:00
美国/纽约
GMT-0500

由于您也有偏移量,因此可以使用DateTimeOffset.Parse()获取DateTimeOffset。从这里,您可以读取DateTime属性。输出dt变量将具有2014-11-17 7:00:00 PM,DateTimeKind属性设置为“未指定”

DateTimeOffset表示一个时间点。通常,它是相对于UTC的。因此,最初解析已有的字段是一种自然的结构

如果希望引用UTC中的同一日期时间,可以使用此选项。此处,输出dt变量将具有2014-11-18 12:00:00 AM,DateTimeKind属性设置为“Utc”


如果您没有偏移量,但只有时区ID,您仍然可以这样做,但您需要NodaTime。我将重点讨论问题的这一部分:

什么是最好的方式将其结合在一起,以便我的日期对象理解它来自东部时区

<start_date>2014-11-17 19:00:00</start_date>
<timezone>America/New_York</timezone>
<timezone_offset>GMT-0500</timezone_offset>
NET中没有内置的数据类型能够充分做到这一点。
DateTimeOffset
类型与特定偏移相关联,例如东部时区可能正在使用的
-05:00
-04:00
(取决于日期)。但这些相同的偏移量也可能完全来自其他时区。时区有一个或多个偏移,但偏移本身不是时区

幸运的是,有解决办法。有两种选择可供考虑:

  • 您可以将
    DateTimeOffset
    TimeZoneInfo
    对象配对。在存储或传输这些数据时,您将只发送完整的
    DateTimeOffset
    以及时区的
    Id

  • 图书馆是处理日期和时间的一种更有效的方法,尤其是涉及时区的时候。它包含一个名为的类型,该类型已经组合了日期、时间、偏移量和时区。它还可用于处理IANA时区标识符,例如您在问题中指定的
    “America/New_York”
    时区

  • 试试NodaTime-
     var dt = DateTime.Parse("2014-11-17 19:00:00-0500", CultureInfo.InvariantCulture).ToUniversalTime();