我正在尝试打印(到屏幕)用户定义的时区中的日期时间偏移。但是,似乎“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,但他们也可能选择其他时间,例如“东部标准时间”或“缅甸标准时间”等。
TimeZoneInfo.ConvertTime
:
将时间转换为特定时区的时间。
DateTimeOffset printableTime = TimeZoneInfo.ConvertTime(myDate, tzi);
Console.WriteLine(printableTime.ToString("yyyy-MM-dd HH:mm:sszzz"));
您可以获取所需时区的偏移量并将其添加回新的
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