C#Datetime.ParseExact用于解析包含UTC文本的字符串

时间:2018-02-04 10:26:14

标签: c# datetime datetime-parsing

我有一个如下所示的日期时间字符串:

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这样的一些现有问题也无济于事。

有什么建议吗?

2 个答案:

答案 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);
  1. 使用DateTimeOffset维护TimeZone信息
  2. HH来映射小时数
  3. zzz来映射时区信息
  4. 因此,为了解决您的问题,我们如何将字符串解析为一种格式,然后我们可以使用该格式解析为日期时间:

    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;