C# 如何以UTC格式打印日期时间?
我只是尝试以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")); //
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”
格式说明符与日期时间
值一起使用。