C# 在本地时区中格式化UTC时间戳

C# 在本地时区中格式化UTC时间戳,c#,datetime,timezone,utc,C#,Datetime,Timezone,Utc,我使用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类创建了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
<注意+01:00

我怎么能得到这个


在本例中,我可以使用DateTime.Local,但时间戳实际上来自另一个系统/模块,因此解决方案必须使用DateTime.UtcNow之类的东西。我已经做了一些测试,但我相信您需要使用DateTime.Now,而不是DateTime.UtcNow

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

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

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


这为我提供了
2019-02-04T10:02:32+00:00
(尽管我在UTC时区)

DateTime.UtcNow提供了UTC的当前时间,其中时间偏移区域为0。改为DateTime。现在改为获取本地时间

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

如果您对将UTC日期时间转换为特定时区的本地时间感兴趣,可以查看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
你也可以看看
有关更多详细信息和受支持时区的完整列表,请参见:“带有
日期时间
值,
”zzz“
自定义格式说明符表示本地操作系统时区与UTC的有符号偏移量,以小时和分钟为单位。它不反映实例的
DateTime.Kind
属性的值“。我认为您正在执行代码的服务器上的本地时区已经是UTC+0。我建议再检查一次。我在自己的电脑上得到这些结果,我100%确定时间在+1。只要另一个系统使用时区生成时间,不管是UTC还是其他时区。任何日期时间都作为UTC时间存储在网络中。Net将在您使用PARSE时自动将日期时间转换为正确的值。使用UtcNow会给您带来问题,因为它会错误地存储时间。您真正想要的是这样的:DateTime date=DateTime.Now;Console.WriteLine(date.ToUniversalTime());对于
DateTime
值,应该使用
K
,而不是
zzz
。将
zzz
DateTimeOffset
值一起使用。如果您想要本地,那么请先使用
DateTime.Now
.ToLocalTime()
。如果您想要故意将时区调整为“+1”,您可以始终使用Sorry,但这与此无关。
K
zzz
是不同的东西。@SonerGönül“K”将返回时区信息,这是一个问题:“我希望它在本地时区格式化”,但OP希望获得UTC偏移部分,
K
将返回
Z
DateTimeKind.UTC
值,正如您在第二个代码部分中看到的那样。这绝对不是OP想要的。