【问题标题】:How to parse a timespan in order to add it to a datetime?如何解析时间跨度以将其添加到日期时间?
【发布时间】:2019-05-08 19:29:46
【问题描述】:

我有一个格式如下的字符串:05/06/2019|1330|60

我正在寻找的输出是:05/06/2019T14:30:00

我现在正在尝试解析 TimeSpan 部分:

  public static string getProcedureEndingDateTime (string input) {
    //05/06/2019|1330|60

    string myDate = input.Split ( '|' ) [0];
    DateTime myDateTime = DateTime.Parse (myDate);

    string myTime = input.Split('|')[1];
    string hours = myTime.Substring(0,2);
    string minutes = myTime.Substring(2,2);
    TimeSpan myTimeSpan = TimeSpan.Parse($"{hours}:{minutes}");

    myDateTime.Add(myTimeSpan);

    return myDateTime.ToString();
}

但是现在,得到以下输出:

为了得到上面的输出,我这样调用我的函数:

Console.WriteLine (getProcedureEndingDateTime("05/06/2019|1330|60"));

如何将字符串“1330”解析为 TimeSpan?

【问题讨论】:

  • 请添加实际的堆栈跟踪,而不是部分截​​图。
  • @0xFF 谢谢我更新了
  • 输入末尾的60是时区偏移量(以分钟为单位)吗?

标签: c# .net datetime timespan


【解决方案1】:

这里不需要我们的时间跨度,只需使用适当的格式调用 ParseExact 即可在一行中完成。

var myDateTime = DateTime.ParseExact("05/06/2019|1330|60", "dd/MM/yyyy|HHmm|60", CultureInfo.InvariantCulture);
Console.WriteLine(myDateTime.ToString()); 
//this gives 2019-06-05 1:30:00 PM, format depends on your PC's locale

我不知道60部分是什么,你可以提前调整格式或者子串出来。

【讨论】:

    【解决方案2】:

    问题是因为Add() 返回一个新的DateTime 实例,这意味着您当前正在丢弃它。存储它,然后从您的函数中返回它,如下所示:

    var adjusted = myDateTime.Add(myTimeSpan);
    return adjusted.ToString();
    

    【讨论】:

    • 那我怎么不丢弃呢?
    • @l--''''''------''''''''''''' 将Add()的结果保存到变量中,就像我在上面的代码中显示的那样,而是从你的函数中返回它。
    【解决方案3】:

    尝试完全使用数字值,数字。

    此外,您的代码的另一个问题是 DateTime.Add() 方法没有添加到该 DateTime 变量中。相反,它会返回一个您忽略的新变量。

    试试这个:

     public static string getProcedureEndingDateTime (string input) {
        string[] parts = input.Split('|');
        string myDate = parts[0];
        DateTime myDateTime = DateTime.Parse (myDate);
    
        string myTime = parts[1];
        if (!int.TryParse(myTime.Substring(0,2), out int hours))
            hours = 0;
        if (!int.TryParse(myTime.Substring(2,2), out int minutes))
            minutes = 0;
        TimeSpan myTimeSpan = new TimeSpan(hours, minutes, 0);
    
        myDateTime += myTimeSpan;
    
        return myDateTime.ToString();
    }
    

    【讨论】:

      【解决方案4】:

      假设显示的日期是 5 月 6 日(而不是 6 月 5 日),并且还假设 60 表示以 GMT 的分钟west 表示的时区偏移量,并且还假设您想要相应的UTC 值,则:

      public static string getProcedureEndingDateTime (string input) {
      
          // example input: "05/06/2019|1330|60"
      
          // separate the offset from the rest of the string
          string dateTimeString = input.Substring(0, 15);
          string offsetString = input.Substring(16);
      
          // parse the DateTime as given, and parse the offset separately, inverting the sign
          DateTime dt = DateTime.ParseExact(dateTimeString, "MM/dd/yyyy|HHmm", CultureInfo.InvariantCulture);
          TimeSpan offset = TimeSpan.FromMinutes(-int.Parse(offsetString));
      
          // create a DateTimeOffset from these two components
          DateTimeOffset dto = new DateTimeOffset(dt, offset);
      
          // Convert to UTC and return a string in the desired format
          DateTime utcDateTime = dto.UtcDateTime;
          return utcDateTime.ToString("MM/dd/yyyy'T'HH:mm:ss", CultureInfo.InvariantCulture);
      }
      

      补充几点:

      • 不仅输入格式很奇怪,而且您想要的输出格式也很奇怪。看到T 分隔日期和时间并且还看到05/06/2019 格式的日期,这很奇怪。 T 几乎总是意味着使用ISO 8601,这需要年-月-日排序和连字符分隔符。如果您想要特定于语言环境的格式,我建议您删除T,或者保留T 并使用标准格式。不要两者都做。

      • 在 ISO 8601 中,将 Z 附加到基于 UTC 的值也是一个好主意。对于DateTime 值,应该使用K specifier。换句话说,您可能希望上面的最后一行是:

        return utcDateTime.ToString("yyyy-MM-dd'T'HH:mm:ssK", CultureInfo.InvariantCulture);
        
        // outputs: "2019-05-06T14:30:00Z"
        
      • 您可能不想在此处格式化字符串,而是返回 DateTimeDateTimeOffset 值。通常最好只在显示时创建一个字符串。

      • 不要忘记DateTime 结构是不可变的。在您的问题中,您忽略了 Add 方法的返回值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-21
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-14
        相关资源
        最近更新 更多