C# 如何以UTC格式打印日期时间?

C# 如何以UTC格式打印日期时间?,c#,datetime,timezone,C#,Datetime,Timezone,我只是尝试以UTC等效时间格式打印日期时间。我做错了什么 var utcEpoch = DateTime.Parse("1970-01-01", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); //This specifies the time I provided is in UTC Console.WriteLine(utcEpoch.ToString("yyyy-MM-dd HH:mm:ss zzz")); //

我只是尝试以UTC等效时间格式打印日期时间。我做错了什么

var utcEpoch = DateTime.Parse("1970-01-01", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); //This specifies the time I provided is in UTC
Console.WriteLine(utcEpoch.ToString("yyyy-MM-dd HH:mm:ss zzz")); //This properly shows my UTC offset of -6, so it's not wrong
Console.WriteLine(utcEpoch.ToString("u")); //This just flat out seems wrong because it doesn't specify a timezone or offset in its output

> 1969-12-31 18:00:00 -06:00
> 1969-12-31 18:00:00Z
我希望最后一次看到
1970-01-01 00:00:00Z

来自:

尽管结果字符串应表示协调的时间 世界时(UTC),不允许对原始日期时间值进行转换 在格式化操作期间执行因此,您必须转换 通过调用
DateTime.ToUniversalTime
方法将日期时间值转换为UTC 在格式化之前
。相反,DateTimeOffset值执行此操作 自动转换;没有必要打电话给警察 格式化操作之前的DateTimeOffset.ToUniversalTime方法

您的
utcEpoch.Kind
不是
UTC
,而是
Local
。您希望它将
UTC
作为
Kind
属性返回,但它不是。它返回
Local

DateTime.Parse("2018-03-03", .CultureInfo.InvariantCulture, .DateTimeStyles.AssumeLocal)
=> [2018-03-03 00:00:00]
这种情况也曾被讨论过,对此有相当好的评价

AssumeLocal
AssumeUniversal
都与输入的方式有关 字符串被解释本身都不会改变输出 种类。

默认输出类型为
Local
。要使其成为
Utc
,可以使用
调整通用
样式

datetimestyle
enum是基于标志的,因此您可以在 一些有意义的方法。实现你最初的目标 执行(将输入解析为
UTC
,并将其输出为
UTC
),然后使用:

DateTime utcDate=DateTime.Parse(“10/01/2006 19:30”,区域性,datetimestyle.AssumeUniversal | datetimestyle.AdjustToUniversal)

正如其他人指出的,单独调用
ToUniversalTime()
也可以,但从技术上讲,这是更正确的

你也可以在电视上看到它


我认为您误解了API的功能

首先要注意的是,
DateTimeStyles.AssumeUniversal
DateTimeStyles.AssumeLocal
仍将返回一个日期时间,其中Kind=Local

> DateTime.Parse("1970-01-01 00:00:00", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).Kind
=> Local
> DateTime.Parse("1970-01-01 00:00:00", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal).Kind
=> Local
所以无论发生什么,我们都会得到一个本地日期。这意味着API最有可能从UTC日期获取本地时间。如果正确的话,让我们试试看

我在瑞典,所以在标准时间内我们是UTC+1。因此,如果我使用
datetimestyle.AssumeUniversal
并输入今天的日期,我应该得到一个本地日期为今天01:00

在C#Interactive中运行此功能:

> DateTime.Parse("2018-03-03", .CultureInfo.InvariantCulture, .DateTimeStyles.AssumeUniversal)
=> [2018-03-03 01:00:00]
意思是C#假设我输入的字符串是UTC格式的,我希望它是本地的,所以它为我“修复”了它

AssumeLocal
执行相同的操作

DateTime.Parse("2018-03-03", .CultureInfo.InvariantCulture, .DateTimeStyles.AssumeLocal)
=> [2018-03-03 00:00:00]
正如预期的那样,我们现在将输入视为本地字符串,并获得相同的值

要获取UTC日期,您可以指定日期类型

DateTime.SpecifyKind(DateTime.Parse("2018-03-03", CultureInfo.InvariantCulture), DateTimeKind.Utc).ToString("o")
=> "2018-03-03T00:00:00.0000000Z"

这个答案(经过编辑)是一个完美的解释。现在它变得更有意义了:)实际上我还有一个问题。当我输出第一个Console.WriteLine时,它仍然返回中心时间的偏移量-6。为什么呢?这是在假设通用和调整通用标志都是set@JoePhillips我试着多作解释。检查它。@JoePhillips设置
AssumingUniversal
和/或
adjustingtuniversal
标志不会改变这里的
zzz
结果。因为不管发生什么,它都会反映当前的时区偏移值。这就是为什么不建议对
DateTime
值使用
z*
格式的原因。From:+++对于日期时间值,
“zzz”
自定义格式说明符表示本地操作系统时区相对于UTC的有符号偏移量,以小时和分钟为单位。它不反映实例的
DateTime.Kind
属性的值。因此,不建议将
“zzz”
格式说明符与
日期时间
值一起使用。