datetime to string with time zone

Com*_*mma 46 c# datetime

我有一个DateTime以通用时间(UTC)存储,值为2010-01-01 01:01:01.

我想以这种格式在美国东部时间2010-01-01 04:01:01GMT-04:00中显示它,但是时区的'K'格式化程序在ToString中不起作用

Han*_*ant 64

使用"zzz"格式说明符获取UTC偏移量.例如:

        var dt = new DateTime(2010, 1, 1, 1, 1, 1, DateTimeKind.Utc);
        string s = dt.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss \"GMT\"zzz");
        Console.WriteLine(s);
Run Code Online (Sandbox Code Playgroud)

输出:2009-12-31 19:01:01 GMT-06:00

我在CDT时区.确保DateTime是明确的DateTimeKind.Utc.

  • GMT对于夏令时并不含糊.夏令时不会改变. (4认同)
  • 请记住,“zzz”所做的只是将当前环境的时区偏移量附加到正在格式化的日期时间的末尾。它不考虑为 DateTime 设置的 DateTimeKind 值。它适用于这种特殊情况,但如果您要格式化 UTC 日期,结果可能不会像您计划的那样。 (2认同)

And*_*rew 6

如果像我一样碰巧需要这样的格式2018-03-31T01:23:45.678-0300(在时区部分没有冒号),则可以使用以下格式:

datetime.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz").Remove(26,1)
Run Code Online (Sandbox Code Playgroud)

  • 这与 IS08601 格式非常相似,您可以只使用“O”格式说明符(“O”包含冒号,默认情况下似乎具有微秒精度) (2认同)
  • 是的,该格式与“yyyy-MM-ddTHH:mm:ss.fffffffzzz”完全相同。 (2认同)

Rob*_*cus 5

像这样的作品。您可能可以多清理一点:

string newDate = string.Format("{0:yyyy-MM-dd HH:mm:ss} GMT {1}", dt.ToLocalTime(), dt.ToLocalTime().ToString("%K"));
Run Code Online (Sandbox Code Playgroud)

  • 您可能是指“HH”,而不是“hh”。 (2认同)
  • Robaticus,我的意思是 12 小时格式与您的答案的其余部分不兼容,因为您没有指定 AM/PM。即应添加“t”/“tt”以使“hh”有意义(例如“02:00 AM”、“03:00 PM”),或者应将“hh”替换为“HH”以生成 24-小时格式(例如“02:00”、“15:00”)。因此,“yyyy-MM-dd hh:mm:ss”格式会产生不明确的输出,无法解码回来:(。 (2认同)

Jon*_*der 5

即使EST不是本地时区,此方法也将返回东部标准时间中的指定时间(根据要求的问题):

public string GetTimeInEasternStandardTime(DateTime time)
{
    TimeZoneInfo easternStandardTime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
    DateTimeOffset timeInEST = TimeZoneInfo.ConvertTime(time, easternStandardTime);
    return timeInEST.ToString("yyyy-MM-dd hh:mm:ss tt\" GMT\"zzz");
}
Run Code Online (Sandbox Code Playgroud)

注意:我尚未在非英语操作系统中对此进行测试。请参阅有关TimeZoneInfo.FindSystemTimeZoneById的MSDN文档。