Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Datetime.ParseExact用于解析包含UTC文本的字符串_C#_Datetime_Datetime Parsing - Fatal编程技术网

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@Cybercop
    offset.Hours
    是一个整数,该代码绝对可以编译:)我的坏我只有offset而不是offset.Hours