Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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# 服务器上.net中的日期时区问题_C#_.net_Datetime - Fatal编程技术网

C# 服务器上.net中的日期时区问题

C# 服务器上.net中的日期时区问题,c#,.net,datetime,C#,.net,Datetime,我想在.net中解析字符串2017-06-02T00:00:00+05:30,并获得日期时间值2017-06-02:00:00。表示服务器正在将此日期转换为东部时区。但我想把它存储在给定的时区。非常感谢您的帮助。我相信使用DateTimeOffset可以满足您的需要 CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US"); DateTime dt = DateTime.ParseExact("2017-06-02T00:0

我想在.net中解析字符串2017-06-02T00:00:00+05:30,并获得日期时间值2017-06-02:00:00。表示服务器正在将此日期转换为东部时区。但我想把它存储在给定的时区。非常感谢您的帮助。

我相信使用DateTimeOffset可以满足您的需要

CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
DateTime dt = DateTime.ParseExact("2017-06-02T00:00:00+05:30", "yyyy-MM-ddTHH:mm:sszzz", culture);
CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
string dateString = "2017-06-02T00:00:00+05:30";
DateTimeOffset offset = DateTimeOffset.Parse(dateString, culture);
// adjustedDateTime should contain 6/2/2017 12:00:00 AM. There are other properties on offset such as LocalDateTime to provide other options
DateTime adjustedDateTime = offset.DateTime;

因为您的输入包含时区偏移量,并且您似乎要求使用
.Kind
=
DateTimeKind.Unspecified
,所以您不能使用
DateTime.Parse
DateTime.ParseExact
,至少不能在不更改输入字符串的情况下使用。没有任何自定义格式化程序(
K
zzz
等)和
datetimestyle
的组合会返回未指定类型的
DateTime
。他们总是在偏移量上拾取,并假设您想要本地时间或UTC

所以,你有一些选择

  • 在解析之前更改字符串,以截断偏移量

    string s = "2017-06-02T00:00:00+05:30";
    DateTime dt = DateTime.ParseExact(s.Substring(0, 19),
                                      "yyyy-MM-dd'T'HH:mm:ss",
                                      CultureInfo.InvariantCulture);
    
  • 解析为
    DateTimeOffset
    ,然后获取
    DateTime
    属性

    string s = "2017-06-02T00:00:00+05:30";
    DateTimeOffset dto = DateTimeOffset.ParseExact(s,
                                      "yyyy-MM-dd'T'HH:mm:sszzz",
                                      CultureInfo.InvariantCulture);
    DateTime dt = dto.DateTime;
    
  • 就我个人而言,我更喜欢选择2。您甚至可以考虑只使用<代码> DATEMEMPLOOS遍历。它通常更适合大多数场景


    还请注意,在解析此格式的字符串时,固定区域性优于本地区域性,因为定义此格式的ISO-8601规范始终使用公历系统。如果使用其他区域性,则可以在不同的日历系统中解释数字,这可能会导致错误。

    给定的是从05:30解析的时区,还是给定的是恒定的“东部时区”?我的意思是05:30可能是多选的时区。还要注意,在任何情况下都不要尝试将05:30解析为时区>
    DateTime
    类型不能保存时区信息。您只能获取本地时间或UTC时间。如果你想保留偏移量,你必须使用DateTimeOffsetHanks。但在这样做之后,它将转换东部时区的日期。我需要和我给定的时区相同的日期时间。例如,我需要这个“2017-06-02T12:30:00+05:30”作为“2017-06-02 12:30:00”。但在应用您的解决方案后,我得到2017-06-01 3:00 PMYes,但
    .Kind
    属性不同。它有正确的时间,并将其转换为本地服务器。计算机知道你想要什么时间。如果您再次为Eastern输出它,它将显示正确的时间。请使用链接解释此代码的工作原理,而不仅仅是给出代码,因为解释更有可能帮助未来的读者。另见。