【问题标题】:How to convert this UTC datetime string to DateTime object c#如何将此 UTC 日期时间字符串转换为 DateTime 对象 c#
【发布时间】:2019-11-01 14:03:13
【问题描述】:

我一直在尝试将此字符串转换为 C# 中的 DateTime 对象

2019-09-23T08:34:00UTC+1

我尝试过使用 DateTime.Parse 但它引发了异常

“字符串未被识别为有效的日期时间。”

【问题讨论】:

  • 可以分享代码吗!
  • 否,这会引发“字符串未被识别为有效日期时间”的异常。
  • 在字符串中看到 UTC+1 部分是不寻常的。通常使用 ISO8601 格式....它来自那个字符串?如果你从字符串中删除 UTC 应该可以工作

标签: c# datetime utc


【解决方案1】:

很抱歉,您似乎是garbage in, garbage out 的受害者。

这是一种不寻常的格式,这就是为什么在我为您提出解决方案之前,我想说的第一件事是“如果您可以,请先修复您的输入”。

假设你不能修正你的输入,那么你需要考虑一些事情;

  1. 首先,如果您的字符串包含UTC 和/或GMT 之类的部分,则没有自定义日期和时间格式说明符来解析它们。这就是为什么您需要将它们作为string literal 转义。 See this question for more details
  2. 其次,您的+1 部分看起来像UTC Offset 值。 The "z" custom format specifier 是解析它所需要的,但要小心,建议将此格式说明符与 DateTime 值一起使用,因为它反映实例的Kind property

作为DateTime 的解决方案,您可以按照我的建议进行解析;

var s = "2019-09-23T08:34:00UTC+1";
DateTime dt;
if(DateTime.TryParseExact(s, "yyyy-MM-dd'T'HH:mm:ss'UTC'z", CultureInfo.InvariantCulture,
                          DateTimeStyles.AdjustToUniversal, out dt))
{
    Console.WriteLine(dt);
}

它将2019-09-23 07:34:00 作为DateTime 提供给您,并将Utc 作为Kind 属性。

作为DateTimeOffset 的解决方案 - 由于您的字符串具有 UTC 偏移值,您应该考虑使用它而不是 Datetime 进行解析 -,作为马特commented,您可以使用它的.DateTime property 来获取它的数据;

var s = "2019-09-23T08:34:00UTC+1";
DateTimeOffset dto;
if(DateTimeOffset.TryParseExact(s, "yyyy-MM-dd'T'HH:mm:ss'UTC'z", CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out dto))
{
    Console.WriteLine(dto.DateTime);
}

这会给你相同的结果DateTime,但Unspecified作为.Kind属性。

但是,我再次强烈建议您先修正您的输入。

【讨论】:

  • 不错的答案。 :) 可能还建议考虑将解析为DateTimeOffset 而不是DateTime
  • @MattJohnson-Pint Ups,完全错过了这一点。非常感谢马特。也添加了该部分(:
【解决方案2】:

使用TryParseExact 将字符串转换为日期时间。这是将给定格式转换为日期时间的示例代码

private static DateTime ParseDate(string providedDate) {
    DateTime validDate;
    string[] formats = {
        "yyyy-MM-ddTHH:mm:ss"
    };
    var dateFormatIsValid = DateTime.TryParseExact(
    providedDate, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out validDate);

    return dateFormatIsValid ? validDate: DateTime.MinValue;
}

然后,使用这个函数来转换字符串。我将 UTC+1 替换为空字符串

static void Main(string[] args) {
    string strdatetime = "2019-09-23T08:34:00UTC+1";
    DateTime dateTime = ParseDate(strdatetime.Replace("UTC+1", ""));

    Console.WriteLine(dateTime);
}

【讨论】:

  • 感谢 Krishna,除了没有及时考虑 +1 之外,这很有效。我如何确保时间是准确的?原因是这是一个跟踪应用程序,我正在解析交货的 ETA,因此 UTA+1 很重要
  • @SeanDavies 您可以使用ParseDate(strdatetime.Replace("UTC+1", "")).ToUniversalTime() 将日期转换为 UTC 时间。或者您可以简单地添加 1 小时 ParseDate(strdatetime.Replace("UTC+1", "")).AddHours(1)
猜你喜欢
  • 2012-03-15
  • 2012-08-13
  • 2022-01-11
  • 2012-10-18
  • 1970-01-01
  • 2012-08-04
  • 2015-10-24
  • 2018-08-29
  • 1970-01-01
相关资源
最近更新 更多