【问题标题】:C# ConvertTimeFromUtc funkinessC# ConvertTimeFromUtc 时髦
【发布时间】:2017-06-08 18:22:23
【问题描述】:

使用下面的代码,我正在尝试将此 datetime 字符串转换为本地 DateTime

private DateTime ConvertToLocalTime(string datetimestring)
{
    DateTime timeUtc = DateTime.Parse(datetimestring);
    TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
    DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone);
    return cstTime;
}

这是我得到的异常:

在 System.TimeZoneInfo.ConvertTime(DateTime dateTime, TimeZoneInfo sourceTimeZone, TimeZoneInfo destinationTimeZone, TimeZoneInfoOptions flags, CachedData cachedData) 在System.TimeZoneInfo.ConvertTimeFromUtc(DateTime dateTime, TimeZoneInfo destinationTimeZone)

转换无法完成,因为提供的 DateTime 没有 Kind 属性设置正确。例如,当 Kind 属性为 DateTimeKind.Local 时, 源时区必须是 TimeZoneInfo.Local。

ConvertTimeFromUtc 的示例看起来与我的代码一模一样,只是我将此字符串解析为 timeUtc: 2017-01-23T05:00:00+00:00

如果我这样调用 Parse:

DateTime.Parse(datetimestring, null, System.Globalization.DateTimeStyles.RoundtripKind);

timeUtc.Kind.ToString() 返回“本地”

那么,我该如何补救呢?时间将发送给我 UTC。

【问题讨论】:

标签: c#


【解决方案1】:

DateTime.Parseconverts 将结果转换为本地时间,与输入字符串中指定的区域无关。您必须明确指定您需要 UTC 结果,因为TimeZoneInfo.ConvertTimeFromUtc 要求 DateTime 值是 UTC 类型。

private DateTime ConvertToLocalTime(string datetimestring)
{
    DateTime timeUtc = DateTime.Parse(datetimestring, null, System.Globalization.DateTimeStyles.AdjustToUniversal);
    TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
    DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone);
    return cstTime;
}

【讨论】:

  • 试过了,timeUtc.Kind 仍然是本地的。
  • @MB34 您是否指定了 AdjustToUniversal?
  • 是的,就像我说的那样。
  • @MB34,不知道出了什么问题,它应该可以工作,我已经在 dotnetfiddle.net 中检查过它也可以工作。
【解决方案2】:

您必须添加DateTime.SpecifyKind

private static DateTime ConvertToLocalTime(string datetimestring)
{
    DateTime timeUtc = DateTime.Parse(datetimestring);
    var dt = DateTime.SpecifyKind(timeUtc, DateTimeKind.Utc);
    TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
    DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(dt, cstZone);
    return cstTime;
}

.net Fiddle

【讨论】:

  • 明天将对此进行测试。没有看到 SpecifyKind 方法。
  • 不,它有效。你可以签入提琴手。 @MB34 错误是当他转换 timeUtc.Kind 是 Local 但 timeUtc 变量有 UTC 时间。 DateTime.SpecifyKind 函数将 timeUtc.Kind 设置为 UTC 而不更改时间。
【解决方案3】:

如果您只想转换为本地日期时间并且不需要偏移量,因为您的字符串具有偏移量信息,DateTime.Parse 将使用偏移量信息并转换为本地日期时间。那么你需要做的就是:

private static DateTime ConvertToLocalTime(string datetimestring)
{
    // Parses to local datetime
    // check the Kind property and you will see it has Local
    return DateTime.Parse(datetimestring);
}

如果您需要带有偏移信息的本地日期时间,请查看DateTimeOffset,因为它就是为此目的:

private static DateTimeOffset ConvertToLocalTime(string datetimestring)
{
    DateTime timeUtc = DateTime.Parse(datetimestring, null, DateTimeStyles.AdjustToUniversal);
    DateTimeOffset dateCst = new DateTimeOffset(timeUtc, TimeZoneInfo.Local.BaseUtcOffset);

    return dateCst;
}

如果您需要将 utc 日期时间转换为其他时区,而不是本地时区,请按如下方式指定:

private static DateTimeOffset ConvertToLocalTime(string datetimestring)
{
    DateTime timeUtc = DateTime.Parse(datetimestring, null, DateTimeStyles.AdjustToUniversal);
    TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
    DateTimeOffset dateCst = new DateTimeOffset(timeUtc, cstZone.GetUtcOffset(timeUtc));

    return dateCst;
}

这是文档:

//
// Summary:
//     Initializes a new instance of the System.DateTimeOffset structure using the specified
//     System.DateTime value and offset.
//
// Parameters:
//   dateTime:
//     A date and time.
//
//   offset:
//     The time's offset from Coordinated Universal Time (UTC).
//
// Exceptions:
//   T:System.ArgumentException:
//     dateTime.Kind equals System.DateTimeKind.Utc and offset does not equal zero.-or-dateTime.Kind
//     equals System.DateTimeKind.Local and offset does not equal the offset of the
//     system's local time zone.-or-offset is not specified in whole minutes.
//
//   T:System.ArgumentOutOfRangeException:
//     offset is less than -14 hours or greater than 14 hours.-or-System.DateTimeOffset.UtcDateTime
//     is less than System.DateTimeOffset.MinValue or greater than System.DateTimeOffset.MaxValue.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多