C#Datetime.ParseExact用于解析包含UTC文本的字符串
我有一个日期时间字符串,如下所示:C#Datetime.ParseExact用于解析包含UTC文本的字符串,c#,datetime,datetime-parsing,C#,Datetime,Datetime Parsing,我有一个日期时间字符串,如下所示: 13.08.2014 17:17:45.000 UTC-60 我试图将其解析为一个C#date-time对象,但它并没有像我预期的那样工作 以下是我尝试过的: DateTime.ParseExact(dateToParse, "dd.MM.yyyy hh:mm:ss.fff Z", CultureInfo.InvariantCulture); DateTime.ParseExact(dateToParse, "dd.MM.yyyy hh:mm:ss.fff
13.08.2014 17:17:45.000 UTC-60
我试图将其解析为一个C#date-time对象,但它并没有像我预期的那样工作
以下是我尝试过的:
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);
它们都返回相同的错误
{"String was not recognized as a valid DateTime."}
现有的一些问题,如,也没有帮助
有什么建议吗?首先,解析的主要问题是您使用的是
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,按照上面提供的方法解析第一部分,并解析UTC
之后的数字,然后将其添加到日期时间中:
myDate.AddMinutes(Int32.Parse("-60"))
或者创建一个DateTimeOffset。在任何一种情况下,您都必须单独解析它们。首先,解析的主要问题是您使用的是
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,按照上面提供的方法解析第一部分,并解析UTC
之后的数字,然后将其添加到日期时间中:
myDate.AddMinutes(Int32.Parse("-60"))
或者创建一个DateTimeOffset。无论哪种情况,您都必须单独解析它们。您对时间格式有多大的控制权。 .Net datetime解析要求您尝试解析的当前时间格式存在两个错误: 首先,您有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
维护时区信息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);
你对时间格式有多大的控制。 .Net datetime解析要求您尝试解析的当前时间格式存在两个错误: 首先,您有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
维护时区信息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);
为什么你链接的问题没有帮助?在现有的答案中,什么是错误的/缺失的?还有,<代码> > UTC/<代码>代表< <代码> > 60 > /代码>,如果你认为它是这样的话,它不是一个有效的UTC偏移值。正如你在接受的答案中看到的,最后添加Z帮助了提出问题的人,另外,建议添加UTC的其他答案对我的案例也没有帮助。正如你所看到的,我已经试着根据那里提供的答案进行解析,但我得到了相同的错误“字符串未被识别为有效日期时间”@Cybercop-这是我关于小心使用格式字符串的观点的一部分。为什么你链接的问题没有帮助?在现有的答案中,什么是错误的/缺失的?还有,<代码> > UTC/<代码>代表< <代码> > 60 > /代码>,如果你认为它是这样的话,它不是一个有效的UTC偏移值。正如你在接受的答案中看到的,最后添加Z帮助了提出问题的人,另外,建议添加UTC的其他答案对我的案例也没有帮助。如您所见,我已尝试根据此处提供的答案进行解析,但我得到相同的错误“字符串未被识别为有效日期时间”@Cybercop-这是我关于小心使用格式字符串的观点的一部分。这也不起作用,它将因
UTC-60
后缀而引发错误。@DavidG代码工作正常,如果你读了我说的话。这里不应该有UTC来解析。这也不起作用,它会因为UTC-60
后缀而抛出一个错误。@DavidG如果你读了我说的,代码工作正常。这里不应该有UTC来解析。我喜欢你的答案,但是bool negative=offset.Hours<0代码>不正确,我们无法将timespan与int进行比较。请告诉您大概偏移量将被删除better@CybercopHours是一个整数,该代码绝对可以编译:)我的坏我只是有偏移量,没有偏移量。Hours我喜欢你的答案,但是bool negative=offset.Hours<0代码>不正确,我们无法将timespan与int进行比较。请告诉您大概偏移量将被删除better@Cybercopoffset.Hours
是一个整数,该代码绝对可以编译:)我的坏我只有offset而不是offset.Hours