查找时间';s位于C#中的不同时区
本文关键字:时区 位于 查找时间 | 更新日期: 2023-09-27 18:24:56
我正试图为一个在澳大利亚的人本地化时间,以查看他的当地时间,而不是美国时间。
我知道他在GMT+10:00,我手头有一个DateTime,但我找不到将该日期时间翻译成他的当地时间的方法(DateTime在服务器时间[美国某个地方])
我试着做了以下
DateTime fromDt = DateTime.Now;//just for presentation (it really comes from API)
string timezone = "+1000";
var dd = DateTime.ParseExact(fromDt.ToString("yyyy-MM-dd HH:mm:ss") + " "
+ timezone, "yyyy-MM-dd HH:mm:ss zzz", CultureInfo.InvariantCulture);
但它不会将当地时间翻译成澳大利亚时间,但如果是澳大利亚时间,它会将时间翻译成美国时间。
你能告诉我如何把美国当地时间翻译成澳大利亚时间吗?
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(fromDt , "AUS Eastern Standard Time");
在这里使用DateTimeOffset
将非常有用。它是DateTime
,但您也可以指定GMT偏移。例如:
var gmtTime = DateTimeOffset.UtcNow; //time at +0:00
var usaEastTime = gmtTime.ToOffset(new TimeSpan(-4, 0, 0)); //time at -4:00
var austTime = gmtTime.ToOffset(new TimeSpan(10, 0, 0)); //time at +10:00
需要记住的一件大事是记住变量的时区,不要把它们混淆。
查找偏移值也比手动插入数字要好得多。目前美国东部时间是-4,但几个月后将是-5。
因此,要合并Brian Rudolph的各种答案,可以使用时区名称查找偏移量,然后将TimeSpan插入ToOffset
函数。
var gmtTime = DateTimeOffset.UtcNow;
var ausTimeZone = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
var austTime = gmtTime.ToOffset(ausTimeZone.BaseUtcOffset);
恰好ausTimeZone.BaseUtcOffset
是+10:00,但是如果发生变化,那么您的代码也会反映出变化。