我有一个如下所示的日期时间字符串:
DateTime.ParseExact(dateToParse, "dd.MM.yyyy hh:mm:ss.fff Z", CultureInfo.InvariantCulture);
DateTime.ParseExact(dateToParse, "dd.MM.yyyy hh:mm:ss.fff UTC", CultureInfo.InvariantCulture);
DateTime.ParseExact(checkInDate, "dd.MM.yyyy hh:mm:ss.fff", CultureInfo.InvariantCulture);
我正在尝试将其解析为C#日期时间对象,但它无法正常工作。
以下是我的尝试:
{"String was not recognized as a valid DateTime."}
他们都返回相同的错误
coolposts
像this这样的一些现有问题也无济于事。
有什么建议吗?
答案 0 :(得分:1)
首先,您解析的主要问题是您使用hh
进行24小时格式化。那应该是HH
。这应该有效:
DateTime.ParseExact("13.08.2014 17:17:45.000", "dd.MM.yyyy HH:mm:ss.fff", null, System.Globalization.DateTimeStyles.AssumeUniversal)
对于UTC部分,这不是标准格式,所以我建议你创建一个帮助方法,将该字符串拆分为2,解析上面提供的第一部分,并解析{{1之后的数字并将其添加到DateTime:
UTC
或创建DateTimeOffset。在任何一种情况下,您都必须单独解析它们。
答案 1 :(得分:0)
您对时间格式有多少控制权。 .Net日期时间解析期望您尝试解析的当前时间格式有两个错误:
首先,您有24小时的时间,因此您的格式必须使用HH
几个小时,小写hh
表示小时数为12小时。
UTC问题是另一个需要你首先修改字符串的问题,.Net期望时区信息的形式为HH:mm,所以下面的字符串和转换将起作用,注意关键差异
var dateToParse = "13.08.2014 17:17:45.000 -01:00";
var value = DateTimeOffset.ParseExact(dateToParse, "dd.MM.yyyy HH:mm:ss.fff zzz", CultureInfo.InvariantCulture);
DateTimeOffset
维护TimeZone信息HH
来映射小时数zzz
来映射时区信息因此,为了解决您的问题,我们如何将字符串解析为一种格式,然后我们可以使用该格式解析为日期时间:
dateToParse = "13.08.2014 17:17:45.000 UTC-60";
string utc = null;
if (dateToParse.Contains("UTC"))
{
var tokens = dateToParse.Split(new string[] { "UTC" }, StringSplitOptions.None);
dateToParse = tokens[0];
utc = tokens[1];
int minutes = int.Parse(utc);
var offset = TimeSpan.FromMinutes(minutes);
bool negative = offset.Hours < 0;
dateToParse += (negative ? "-" : "") + Math.Abs(offset.Hours).ToString().PadLeft(2,'0') + ":" + offset.Minutes.ToString().PadLeft(2,'0');
}
var value = DateTimeOffset.ParseExact(dateToParse, "dd.MM.yyyy HH:mm:ss.fff zzz", CultureInfo.InvariantCulture);
老实说,这比我想象的要复杂得多,可能会有一些正则表达式可能会有所帮助,但是第一个处理字符串的主要方法首先使用你的字符串。
最后,现在我们有一个DateTimeOffset值,如果你需要,你可以很容易地将它转换成任何本地或其他时区,而不需要太多:
var asUtc = dateValue.UtcDateTime;
var asLocal = dateValue.LocalDateTime;
var asSpecific = dateValue.ToOffset(TimeSpan.FromHours(10)).DateTime;