我需要将DateTime协定转换为给定的偏移值。 我的值像:
-08:00
-07:00
+08:00
+07:00
+02:00
+05:30
如何根据这些给定的偏移值转换日期时间。 我尝试过:
string t = "Pacific Standard Time";
var tInfo = TimeZoneInfo.FindSystemTimeZoneById(t);
var data = TimeZoneInfo.ConvertTime(DateTime.Now, tInfo);
这很好,但是我需要根据偏移值进行转换。
请在这里建议如何进行转换。
谢谢
答案 0 :(得分:3)
存储时区偏移量的类型为DateTimeOffset。如果您关心偏移量,请使用该类型而不是DateTime。否则,除非将偏移量与日期时间一起存储,否则您将无法比较具有不同偏移量的日期。
DateTimeOffset.Now和DateTimeOffset.UtcNow之类的属性将分别返回机器时区或UTC的当前时间。
从DateTime中以特定的偏移量创建DateTimeOffset就像调用适当的构造函数一样简单,例如:
var pstTime=new DateTimeOffset(2019,1,14,1,0,0,new TimeSpan(-8,0,0));
您可以使用ToOffset将DateTimeOffset
的值转换为不同的偏移量,例如:
var eastEuropeTime=pstTime.ToOffset(new TimeSpan(2,0,0));
这将返回上午11点。
ToUniversalTime将以UTC返回时间,即+00:00:
var utcTime=pstTime.ToUniversalTime();
哪个早上9点返回。
从/到DateTime的转换
您还可以从现有的DateTime
值构造DateTimeOffset。 constructor检查输入的DateTime的Kind属性,如果使用DateTime.Kind
,则拒绝使用无效的偏移量。
对于Utc,唯一有效的值为00:00。
var now=DateTime.UtcNow;
var utcOffset=new DateTimeOffset(now, TimeSpan.Zero);
utcOffset.Dump();
对于本地时间,唯一有效的值是机器的偏移量。要将本地时间转换为DateTimeOffset,可以从TimeZoneInfo.Local
中获取其偏移量:
var now=DateTime.Now;
var localOffset=new DateTimeOffset(now, TimeZoneInfo.Local.GetUtcOffset(now));
任意偏移量
在某些情况下,我们可能希望按原样使用DateTime,并带有特定的偏移量。例如,许多网站(尤其是论坛)都允许用户指定其时区,从而避免在浏览器上检测时区问题。
在其他情况下,偏移量可以单独存储或来自IANA时区名称。
要使用任意偏移量,DateTime的Kind必须具有Unspecified
:
var date=new DateTime(2019,01,15,18.17.00, DateTimeKind.Unspecified);
var pst=new DateTimeOffset(date,new TimeSpan(-8,0,0));
例如,在从数据库加载datetime
值时,这很有用。从数据库加载的DateTime值为Unspecified
。
来自代码或输入控件的值可能已经是Local或UTC。在这种情况下,我们需要使用DateTime.SpecifyKind创建一个新的Unspecified
DateTime值:
var date=DateTime.SpecifyKind(domeDate,DateTimeKind.Unspecified);
var pst=new DateTimeOffset(date,new TimeSpan(-8,0,0));
答案 1 :(得分:0)
您可以使用的是DateTimeOffset.Parse
例如:
var offsetValue = "+08:00";
var now = DateTime.Now;
var nowString = now.ToString("dd/MM/yyyy HH:mm:ss");
var offsetDateTime = DateTimeOffset.Parse($"{nowString} {offsetValue}");
请注意,以上仅是示例,它忽略了任何文化特定的问题等。