C# 如何解析UTC日期?

C# 如何解析UTC日期?,c#,datetime,C#,Datetime,我有两个字符串时间戳和UTC偏移量 "timestamp":"2014-03-18T06:40:40+00:00","utc_offset":"+02:00" 我正试图找到一种方法来使用这两种方法来解析和创建UTC日期 我能够将时间戳解析为DateTime,但无法从标准DateTime类中找到帮助来解析utc_偏移量,因此无法将偏移量添加到时间戳 在不进行字符串操作的情况下,是否有标准的方法来处理此问题?您必须创建一个TimeSpan对象,并将其添加到DateTime中 TimeSpan ts

我有两个字符串时间戳和UTC偏移量

"timestamp":"2014-03-18T06:40:40+00:00","utc_offset":"+02:00"
我正试图找到一种方法来使用这两种方法来解析和创建UTC日期

我能够将时间戳解析为DateTime,但无法从标准DateTime类中找到帮助来解析utc_偏移量,因此无法将偏移量添加到时间戳


在不进行字符串操作的情况下,是否有标准的方法来处理此问题?

您必须创建一个
TimeSpan
对象,并将其添加到
DateTime

TimeSpan tspan = TimeSpan.Parse("-02:00");
Console.WriteLine(tspan);   //This will print -02:00:00
有关如何将偏移字符串(“+02:00”)转换为
TimeSpan
,请参见以下答案:


编辑:请注意,如果偏移量字符串中有字符
“+”
,则必须在执行
TimeSpan.Parse(“偏移量字符串”)
之前将其删除。这是唯一需要的字符串操作。负偏移量需要
'-'
字符,但这应该是显而易见的。

使用正则表达式和
日期时间。TryParse
您可以首先替换日期的偏移量部分,然后将其解析为
日期时间

var regex = new Regex(@"\+.+$");
var withOffset = regex.Replace("2014-03-18T06:40:40+00:00", "+02:00");

DateTime date;
DateTime.TryParse(withOffset, out date);
或者,您可以使用
TimeSpan.TryParse
(如@PaulG metnions)得出相同的答案

DateTime date;
DateTime.TryParse("2014-03-18T06:40:40+00:00", out date);
TimeSpan span;
TimeSpan.TryParse("+02:00", out span);
date.Add(span);

除了字符串操作或PaulG所做的timespan操作之外,我不确定还有什么好方法可以做到这一点

string timestamp = "2014-03-18T06:40:40+00:00";
string utc_offset = "+02:00";

// Remove everything at the end beginning with the +
string complete = timestamp.Remove(timestamp.LastIndexOf('+')) + utc_offset; 
另一种方法

string timestampString = "2014-03-18T06:40:40+00:00";
DateTimeOffset timestamp = DateTimeOffset.Parse(timestampString);
string utcOffsetString = "+02:00";
DateTimeOffset utcOffset = DateTimeOffset.ParseExact(utcOffsetString, "zzz", null);
DateTime fullDate = timestamp.UtcDateTime.Add(utcOffset.Offset);

只是为了完整性,你可以考虑一下。它的学习曲线很小,但几乎总是值得的

以下是你如何利用野田佳彦的时间做到这一点:

  • 首先,创建一些模式。如果愿意,可以保留这些实例的静态实例,以便在重用时获得更好的性能

    OffsetDateTimePattern tsPattern = OffsetDateTimePattern.GeneralIsoPattern;
    OffsetPattern offsetPattern = OffsetPattern.GeneralInvariantPattern;
    
  • 使用这些模式将您拥有的值解析为相应的节点时间数据类型。(您也可以为时间段考虑<代码>即时/代码>,但只有当您确信您将始终以零为零来接收它。通常,您将看到一个<代码> z <代码>。)

  • 最后,您可以将偏移量应用于时间戳

    OffsetDateTime result = timestamp.ToInstant().WithOffset(offset);
    

因此,您不愿意用utc_offset中的值替换时间戳字符串中的最后5个字符?您看过了吗?在utc中将时间戳解析为
DateTime
,然后将偏移解析为
TimeSpan
,并将它们组合成
DateTimeOffset
。使用
DateTime
而不是
DateTimeOffset
来表示具有特定偏移量的时间在我看来是个坏主意。@code我认为这不是个坏主意。您的代码抛出“字符串未被识别为有效的时间跨度。”FormatException。@UlugbekUmirov如果偏移量字符串包含必须删除的
+
第一。但是
-
工作正常。如果不删除
+
,则会抛出yes错误。
OffsetDateTime timestamp = tsPattern.Parse("2014-03-18T06:40:40+00:00").Value;
Offset offset = offsetPattern.Parse("+02:00").Value;
OffsetDateTime result = timestamp.ToInstant().WithOffset(offset);