我有两个字符串时间戳和一个UTC偏移量。
"timestamp":"2014-03-18T06:40:40+00:00","utc_offset":"+02:00"
我试图找到一种方法来使用这两个来解析和创建UTC日期。
我能够将时间戳解析为DateTime,但是没有从标准DateTime类中找到帮助来解析utc_offset,并且无法将偏移量添加到时间戳。
没有进行字符串操作,是否有一种标准的方法来处理它?</ p>
答案 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);