为什么该日期打印时时区不正确?

问题描述 投票:0回答:2

我正在尝试打印(到屏幕)用户定义的时区中的日期时间偏移。但是,似乎“TimeZoneInfo.ConvertTimeFromUtc”函数实际上更改了时间对象,而“ToString”函数始终恢复为系统时区。这是我的代码:

var myDate = DateTimeOffset.Parse("2023-08-18T12:39:00.000-0800"); // date input as PST
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Greenwich Standard Time");
DateTime printableTime = TimeZoneInfo.ConvertTimeFromUtc(myDate.UtcDateTime, tzi); // converting to UDT per customer's request
logger.LogInformation(printableTime.ToString("yyyy-MM-dd HH:mm:sszzz")); // (attempt to) output in UDT

它实际上改变了时间,然后以 CST(我的系统时区)打印该时间:

2023-08-18 20:39:00-05:00

我不明白

TimeZoneInfo.ConvertTimeFromUtc
是如何工作的吗?我认为它只是改变了 DateTime 对象的时区。我在这里缺少什么?我需要做什么才能使“ToString”函数简单地打印“格林威治标准时间”时区中的原始 DateTime 对象,如下所示:

2023-08-18 20:39:00+00:00

*编辑:我不能简单地使用

model.DateFrom.UtcDateTime
来获取 UDT 日期,因为这是客户定义的。他们在本例中选择了 UDT,但他们也可能选择其他时间,例如“东部标准时间”或“缅甸标准时间”等。

c# timezone-offset
2个回答
0
投票

您可以尝试使用

TimeZoneInfo.ConvertTime
:

将时间转换为特定时区的时间。

DateTimeOffset printableTime = TimeZoneInfo.ConvertTime(myDate, tzi);
Console.WriteLine(printableTime.ToString("yyyy-MM-dd HH:mm:sszzz"));

0
投票

您可以获取所需时区的偏移量并将其添加回新的

DateTimeOffset
对象。

这是一个例子。

var myDate = DateTimeOffset.Parse("2023-08-18T12:39:03.723-0800"); // date input as PST
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime printableTime = TimeZoneInfo.ConvertTimeFromUtc(myDate.UtcDateTime, tzi); // converting to UDT per customer's request
Console.WriteLine(printableTime.ToString("yyyy-MM-dd HH:mm:sszzz")); // (attempt to) output in UDT

TimeSpan offset = tzi.GetUtcOffset(printableTime);
DateTimeOffset dateTimeOffset = new DateTimeOffset(printableTime, offset);
Console.WriteLine(dateTimeOffset.ToString("yyyy-MM-dd HH:mm:sszzz")); // Outputs the current date and time with the selected time zone offset
© www.soinside.com 2019 - 2024. All rights reserved.