Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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# 使用UTC转换获取时区_C#_.net_Timezone_Utc - Fatal编程技术网

C# 使用UTC转换获取时区

C# 使用UTC转换获取时区,c#,.net,timezone,utc,C#,.net,Timezone,Utc,我的系统日期在英国夏令时。我想把它转换成UTC。下面的人也是如此: string utcDate= TimeZoneInfo.ConvertTimeToUtc(dt).ToString("dd/MM/yyyy HH:mm:ss"); 我想要的是获得区域以及UTC中的日期。请考虑夏时制。< /P> 示例:2019-07-08T23:59:00+01:00。我想你可以这样做: var dt = DateTime.Now; string utcDate = dt.ToUniversalTime().

我的系统日期在英国夏令时。我想把它转换成UTC。下面的人也是如此:

string utcDate= TimeZoneInfo.ConvertTimeToUtc(dt).ToString("dd/MM/yyyy HH:mm:ss");
我想要的是获得区域以及UTC中的日期。请考虑夏时制。< /P>
示例:
2019-07-08T23:59:00+01:00。

我想你可以这样做:

var dt = DateTime.Now;
string utcDate = dt.ToUniversalTime().ToString("dd/MM/yyyy HH:mm:ss") +
                 dt.ToString(" zzz");
输出:(我在EET)

14/07/2019 20:02:17+02:00
但请注意,这可能会让人感到困惑。标准方法是时区遵循本地日期,而不是通用日期。

以下几点:

  • 您在示例中给出的字符串格式,
    2019-07-08T23:59:00+01:00
    是规范的一部分。准确地说,它是“ISO 8601扩展格式”的“完整日期和时间表示”。它还包含由定义的格式

  • 在这种格式中,日期和时间部分表示本地时间,如时区偏移部分所示。换句话说,这些值不是UTC的,而是已经调整过的。在您的示例中,
    2019-07-08T23:59:00
    是当地时间,
    UTC+01:00
    在该时间生效。因此,相应的UTC时间将提前一小时,
    2019-07-08T22:59:00Z

  • 您似乎在询问UTC的日期,但偏移量包括夏令时。这是不可能的,因为UTC不遵守夏令时。与UTC的偏移量始终为零

  • UTC本身的偏移量用
    Z
    表示,但也可以用
    +00:00
    表示,可以将其视为“UTC的零偏移量”。换句话说,如果您指的是UTC时间,请使用
    Z
    ,如果您指的是与UTC一致的本地时间(如冬季伦敦的GMT或冰岛等),请使用
    +00:00

  • 在您的问题中,您表示希望系统时间以UTC为单位,并带有偏移量。我假设“系统时间”是指系统时钟的当前时间。这是由
    DateTime.UtcNow
    DateTimeOffset.UtcNow
    提供的。它们返回
    DateTime
    DateTimeOffset
    结构,而不是字符串。由于您需要特定格式的字符串,因此应首先询问当前时间,然后使用
    ToString
    将其格式化为字符串:

    使用系统全球化;
    

    string a=DateTime.UtcNow.ToString(“yyyy-MM-dd'T'HH:MM:ssK”,CultureInfo.InvariantCulture);
    //输出示例:“2019-07-08T22:59:00Z”
    字符串b=DateTimeOffset.UtcNow.ToString(“yyyy-MM-dd'T'HH:MM:sszzz”,CultureInfo.InvariantCulture);
    //输出示例:“2019-07-08T22:59:00+00:00”
    
  • 如果您真正想要的是当地时间,例如冬季偏移量为
    +00:00
    ,夏季偏移量为
    +01:00
    (在英国),则使用
    立即
    而不是
    UtcNow
    。这将给出运行代码的计算机时区中的本地时间

    string c=DateTime.Now.ToString(“yyyy-MM-dd'T'HH:MM:ssK”,CultureInfo.InvariantCulture);
    //输出示例:“2019-07-08T23:59:00+01:00”
    字符串d=DateTimeOffset.Now.ToString(“yyyy-MM-dd'T'HH:MM:sszzz”,CultureInfo.InvariantCulture);
    //输出示例:“2019-07-08T23:59:00+01:00”
    
  • 如果不管本地计算机的时区是什么,您实际上想要在英国的时间,那么您必须首先获得UTC时间,然后在创建字符串之前将其转换为英国时间

    TimeZoneInfo tzi=TimeZoneInfo.FindSystemTimeZoneById(“GMT标准时间”);
    字符串e=TimeZoneInfo.ConvertTime(DateTime.UtcNow,tzi).ToString(“yyyy-MM-dd'T'HH:MM:ssK”,CultureInfo.InvariantCulture);
    //输出示例:“2019-07-08T23:59:00”
    字符串f=TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow,tzi).ToString(“yyyy-MM-dd'T'HH:MM:sszzz”,CultureInfo.InvariantCulture);
    //输出示例:“2019-07-08T23:59:00+01:00”
    
    在示例
    e
    中,请注意,
    DateTime
    不能存储作为时区转换结果的任意偏移量,因此您将
    DateTimeKind.Unspecified
    分配给
    Kind
    属性,这将导致字符串表示中没有偏移量。因此,大多数情况下,您应该使用
    DateTimeOffset
    (示例
    f

    另外,请注意,
    “GMT标准时间”
    的时区ID是在Windows平台上用于英国的正确ID。适当时,它可以在GMT和BST之间正确切换。如果您在非Windows平台(Linux、OSX等)上运行.NET Core,则应使用
    “Europe/London”
    。或者,如果您想编写与平台无关的代码,那么可以使用my library,它允许您提供任何一种形式并在任何平台上运行

  • 在代码示例中,您没有调用任何“now”函数,而是给出了一个
    dt
    变量。假设这是一个
    DateTime
    ,调用
    TimeZoneInfo.ConvertTimeToUtc
    的结果将取决于该变量的
    种类
    属性。如果是
    DateTimeKind.Utc
    ,则不执行任何转换。如果是
    DateTimeKind.Local
    DateTimeKind.Unspecified
    ,则该值将从计算机的本地时区转换为UTC

  • 最后,请记住,在与国际观众交谈时,时区缩写可能会模棱两可。我可以通过“BST”推断你指的是英国夏季时间,但这只是因为你的问题中显示了
    +01:00
    偏移量。“BST”也可以代表“孟加拉国标准时间”(
    +06:00
    ),或“布干维尔标准时间”(
    +11:00


如果您想了解如何让Javascript为用户获取本地时区,我不久前回答了一个类似的问题。不清楚你在问什么。我