C# 使用UTC转换获取时区
我的系统日期在英国夏令时。我想把它转换成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().
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
但请注意,这可能会让人感到困惑。标准方法是时区遵循本地日期,而不是通用日期。以下几点:
- 您在示例中给出的字符串格式,
是规范的一部分。准确地说,它是“ISO 8601扩展格式”的“完整日期和时间表示”。它还包含由定义的格式2019-07-08T23:59:00+01:00
- 在这种格式中,日期和时间部分表示本地时间,如时区偏移部分所示。换句话说,这些值不是UTC的,而是已经调整过的。在您的示例中,
是当地时间,2019-07-08T23:59:00
在该时间生效。因此,相应的UTC时间将提前一小时,UTC+01:00
2019-07-08T22:59:00Z
- 您似乎在询问UTC的日期,但偏移量包括夏令时。这是不可能的,因为UTC不遵守夏令时。与UTC的偏移量始终为零
- UTC本身的偏移量用
表示,但也可以用Z
表示,可以将其视为“UTC的零偏移量”。换句话说,如果您指的是UTC时间,请使用+00:00
,如果您指的是与UTC一致的本地时间(如冬季伦敦的GMT或冰岛等),请使用Z
+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
的时区ID是在Windows平台上用于英国的正确ID。适当时,它可以在GMT和BST之间正确切换。如果您在非Windows平台(Linux、OSX等)上运行.NET Core,则应使用“GMT标准时间”
。或者,如果您想编写与平台无关的代码,那么可以使用my library,它允许您提供任何一种形式并在任何平台上运行“Europe/London”
- 在代码示例中,您没有调用任何“now”函数,而是给出了一个
变量。假设这是一个dt
,调用DateTime
的结果将取决于该变量的TimeZoneInfo.ConvertTimeToUtc
属性。如果是种类
,则不执行任何转换。如果是DateTimeKind.Utc
或DateTimeKind.Local
,则该值将从计算机的本地时区转换为UTCDateTimeKind.Unspecified
- 最后,请记住,在与国际观众交谈时,时区缩写可能会模棱两可。我可以通过“BST”推断你指的是英国夏季时间,但这只是因为你的问题中显示了
偏移量。“BST”也可以代表“孟加拉国标准时间”(+01:00
),或“布干维尔标准时间”(+06:00
)+11:00