如何解析UTC日期
本文关键字:日期 UTC 何解析 | 更新日期: 2023-09-27 17:51:03
我有两个字符串时间戳和一个UTC偏移量。
"timestamp":"2014-03-18T06:40:40+00:00","utc_offset":"+02:00"
我正试图找到一种方法来使用这两个来解析和创建一个UTC日期。
我能够将时间戳解析为DateTime,但无法从标准DateTime类中找到解析utc_offset的帮助,并且无法将偏移量添加到时间戳。
不去String操作,是否有一个标准的方法来处理这个?
您必须创建一个TimeSpan
对象并将其添加到您的DateTime
。
TimeSpan tspan = TimeSpan.Parse("-02:00");
Console.WriteLine(tspan); //This will print -02:00:00
请参阅以下关于如何将偏移字符串("+02:00")转换为TimeSpan
的答案:
如何将字符串偏移量转换为时间跨度
编辑:请注意,如果您在偏移字符串中有字符'+'
,则必须在执行TimeSpan.Parse("offsetString")
之前将其删除。这是唯一需要的字符串操作。负偏移量需要'-'
字符,但这应该是显而易见的。
我不确定除了字符串操作或PaulG完成的时间跨度操作之外还有什么好方法
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;
使用正则表达式和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);
另一种方法
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);
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.
为了完整起见,您可以考虑Noda Time。它有一个小的学习曲线,但它几乎总是值得的!
下面是你如何使用Noda时间:
-
首先,创建一些模式。如果您愿意,可以保留这些实例的静态实例,以便在重用时获得更好的性能。
OffsetDateTimePattern tsPattern = OffsetDateTimePattern.GeneralIsoPattern; OffsetPattern offsetPattern = OffsetPattern.GeneralInvariantPattern;
-
使用这些模式将您拥有的值解析为相应的节点时间数据类型。(您也可以考虑将
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);