如何解析UTC日期?

时间:2014-03-20 14:21:35

标签: c# datetime

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

"timestamp":"2014-03-18T06:40:40+00:00","utc_offset":"+02:00"

我试图找到一种方法来使用这两个来解析和创建UTC日期。

我能够将时间戳解析为DateTime,但是没有从标准DateTime类中找到帮助来解析utc_offset,并且无法将偏移量添加到时间戳。

没有进行字符串操作,是否有一种标准的方法来处理它?<​​/ p>

6 个答案:

答案 0 :(得分:4)

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

TimeSpan tspan = TimeSpan.Parse("-02:00");
Console.WriteLine(tspan);   //This will print -02:00:00

请参阅以下有关如何将偏移字符串(“+ 02:00”)转换为TimeSpan的答案:

How to convert string offset to timespan in c#

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

答案 1 :(得分:2)

“我不确定在字符串操作之外的任何好方法或Paul G完成的时间跨度

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; 

答案 2 :(得分:1)

使用正则表达式和DateTime.TryParse,您可以先将偏移部分替换为日期,然后将其解析为DateTime

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

答案 3 :(得分:1)

另一种方法

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

答案 4 :(得分:1)

string sNoOffset = "2014-03-18T06:40:40";

DateTime dt = DateTime.Parse(sNoOffset);

TimeSpan ts = TimeSpan.Parse(s);//where s is the offset

dt = dt.AddTicks(ts.Ticks);

MessageBox.Show(dt.ToString());

// Please customize the above lines of code to your liking.

答案 5 :(得分:1)

为了完整起见,您可以考虑Noda Time。它有一个小的学习曲线,但它几乎总是值得的!

以下是使用Noda Time的方法:

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

    OffsetDateTimePattern tsPattern = OffsetDateTimePattern.GeneralIsoPattern;
    OffsetPattern offsetPattern = OffsetPattern.GeneralInvariantPattern;
    
  • 使用这些模式将您拥有的值解析为适当的Noda Time数据类型。 (您可能还会考虑Instant您的时间跨度,但前提是您确定始终会以全零的偏移量接收它。通常情况下,您会看到Z

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