如何使用偏移值转换日期时间

时间:2019-01-14 08:06:31

标签: c# date timezone-offset timestamp-with-timezone

我需要将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);

这很好,但是我需要根据偏移值进行转换。

请在这里建议如何进行转换。

谢谢

2 个答案:

答案 0 :(得分:3)

存储时区偏移量的类型为DateTimeOffset。如果您关心偏移量,请使用该类型而不是DateTime。否则,除非将偏移量与日期时间一起存储,否则您将无法比较具有不同偏移量的日期。

DateTimeOffset.NowDateTimeOffset.UtcNow之类的属性将分别返回机器时区或UTC的当前时间。

从DateTime中以特定的偏移量创建DateTimeOffset就像调用适当的构造函数一样简单,例如:

var pstTime=new DateTimeOffset(2019,1,14,1,0,0,new TimeSpan(-8,0,0));

您可以使用ToOffsetDateTimeOffset的值转换为不同的偏移量,例如:

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}");

请注意,以上仅是示例,它忽略了任何文化特定的问题等。