【问题标题】:Formatting UTC timestamp in local timezone在本地时区格式化 UTC 时间戳
【发布时间】:2019-02-04 10:10:57
【问题描述】:

我有一个使用 DateTime 类创建的 UTC 时间戳。

var time = DateTime.UtcNow;

当我格式化它时,我得到以下结果:

time.ToString("yyyy-MM-ddTHH:mm:sszzz")
> 2019-02-03T10:08:40+00:00

这是正确的,但我希望它在本地时区中格式化,如下所示:

2019-02-03T11:08:40+01:00

我怎样才能得到这个?

我可以在此示例中使用 DateTime.Local,但时间戳实际上来自另一个系统/模块,因此解决方案必须适用于 DateTime.UtcNow 之类的东西

【问题讨论】:

  • 来自docs:“使用DateTime 值,"zzz" 自定义格式说明符表示本地操作系统的时区与 UTC 的有符号偏移量,以小时和分钟。它不反映实例的 DateTime.Kind 属性的值”。我认为您正在执行该代码的服务器上的本地时区是已经 UTC+0。我建议再检查一次。
  • 我在自己的电脑上得到这些结果,我 100% 确定时间在 +1 内。
  • 只要其他系统使用时区生成时间,它是 UTC 还是任何其他时区都没有关系。任何 DateTime 都作为 UTC 时间存储在 Net 中。当您使用 PARSE 时,Net 会自动将日期时间转换为正确的值。使用 UtcNow 会给您带来问题,因为它会错误地存储时间。你真正想要的是这样的: DateTime date = DateTime.Now; Console.WriteLine(date.ToUniversalTime());
  • 对于DateTime 值,您应该使用K,而不是zzz。将 zzzDateTimeOffset 值一起使用。如果你想要本地,那么首先使用DateTime.Now,或者.ToLocalTime()

标签: c# datetime timezone utc


【解决方案1】:

我做了一些测试,但我相信您需要使用 DateTime.Now 而不是 DateTime.UtcNow。

当您在格式中使用“z”字符时,转换会考虑到您需要时间偏移并相应地更改时间。

尝试以下方法,让我知道它是否适合您:

DateTime.Now.ToString("yyyy-MM-ddTHH:MM:sszzzz")

这给了我2019-02-04T10:02:32+00:00(虽然我在 UTC 时区)

【讨论】:

  • 如果您想故意将时区调整为“+1”,您可以随时使用DateTimeOffset
【解决方案2】:

如果您有兴趣将 UTC DateTime 转换为特定时区的本地时间,可以查看 TimeZoneInfo 类。 这是一个例子:

var utcDate = DateTime.UtcNow;

// 04/02/2019 11:23:39
// Kind is Utc

var localDate = utcDate.ToLocalTime();

// 04/02/2019 12:23:39
// Kind is now local

var timeZoneId = "US Eastern Standard Time";

var timeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);

DateTime usEasternStandardDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDate, timeZone);

// 04/02/2019 06:23:39
// Kind is unspecified

你也可以看看 Convert UTC/GMT time to local time 了解更多详情,List of Timezone ID's for use with FindTimeZoneById() in C#? 了解支持时区的完整列表

【讨论】:

    【解决方案3】:

    DateTime.UtcNow 给出 UTC 的当前时间,其中时差区为 0。改为 DateTime.Now 以获取本地时间。

    DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss K")
    // 2019-02-04T08:36:11 -02:00
    
    DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss K")
    // 2019-02-04T10:36:22 Z
    

    【讨论】:

    • 抱歉,这无关紧要。 Kzzz 是不同的东西。
    • @SonerGönül "K" 将返回时区信息,这就是问题:“我希望将其格式化为本地时区”
    • 但是 OP 想要获取 UTC 偏移量部分,K 将返回 ZDateTimeKind.UTC 值,正如您在第二个代码部分中看到的那样。这绝对不是 OP 想要的。
    猜你喜欢
    • 2015-06-03
    • 2019-03-09
    • 2017-06-15
    • 2019-01-05
    • 2019-08-15
    • 2018-04-17
    • 1970-01-01
    • 2017-04-23
    • 2014-08-26
    相关资源
    最近更新 更多