【问题标题】:Converting Times Between Time Zones, The conversion could not be completed在时区之间转换时间,转换无法完成
【发布时间】:2017-02-21 05:02:14
【问题描述】:

我正在尝试在时区之间转换时间

public QueryResult<RadAcct> Query(DateTime dateFrom, DateTime dateTo, DbConnection dbConection)
{
   TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");

   //date from :2/20/2017 10:28:27 AM
   DateTime from = TimeZoneInfo.ConvertTimeToUtc(dateFrom, tst); 

   // error here, date to : 2/21/2017 4:56:31 Am
   DateTime to = TimeZoneInfo.ConvertTimeToUtc(dateTo, tst); 
}

dateFrom 和 dateTo 来自不同的服务,值是 2/20/2017 10:28:27 AM , 2/21/2017 4:56:31 Am

我遇到了异常:

转换无法完成,因为提供的 DateTime 没有正确设置 Kind 属性。例如,当 Kind 属性为 DateTimeKind.Local 时,源时区必须为 TimeZoneInfo.Local。\r\n参数名称:sourceTimeZone

【问题讨论】:

  • dateTo是如何初始化的?来自客户?来自分贝?硬编码?来自其他服务? Am 是故意的还是错字?
  • 您的dateTo 似乎无效,否则不可能转换为其他时区。
  • sr 关于我更新了我的问题

标签: c# timezone utc


【解决方案1】:

使用DateTime.SpecifyKind函数将Kind设置为Unspecified,

TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
DateTime from = TimeZoneInfo.ConvertTimeToUtc(dateFrom, tst); //date from :2/20/2017 10:28:27 AM

DateTime dateToUnspecified = DateTime.SpecifyKind(dateTo, DateTimeKind.Unspecified);

DateTime to = TimeZoneInfo.ConvertTimeToUtc(dateToUnspecified, tst); // date to : 2/21/2017 4:56:31 Am

【讨论】:

  • 另外,您可能想首先弄清楚您的代码是如何将DateTimeKind.Local 附加到dateTo 的。例如,如果 dateTo 是从对 DateTime.Now 的调用中填充的,则此特定答案将不是正确的解决方案。
【解决方案2】:

您已指定从时区。但我找不到到时区。您可以使用以下代码在时区之间转换时间。

        DateTime dateFrom = Convert.ToDateTime("2/21/2017 04:22:27 PM");
        TimeZoneInfo fromTimeZone = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
        DateTime from = TimeZoneInfo.ConvertTimeToUtc(dateFrom, fromTimeZone);
        TimeZoneInfo toTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
        DateTime dateTo = TimeZoneInfo.ConvertTimeFromUtc(from, toTimeZone);

以上代码是对您代码的修改。但是您可以使用更简单的代码来执行此操作:

        DateTime dateFrom = Convert.ToDateTime("2/21/2017 04:22:27 PM");
        TimeZoneInfo fromTimeZone = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
        TimeZoneInfo toTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
        DateTime dateTo = TimeZoneInfo.ConvertTime(dateFrom, fromTimeZone, toTimeZone);

我猜您只是想将两次都转换为 UTC。异常的原因可能是 dateTo 的 Kind 属性设置为 Local 并且运行代码的系统的本地时区不是“AUS Eastern Standard Time”。如果传递给 ConvertTimeToUtc 方法的日期类型是 Local,则该方法将期望 sourceTimeZone 参数与运行代码的系统的本地时区匹配。

您可以使用以下代码将 dateTo 的 Kind 属性设置为 UnSpecified。这样你就不会得到异常:

DateTime.SpecifyKind(dateTo, DateTimeKind.Unspecified);

【讨论】:

  • 但 dateFrom 和 dateTo 是同一时区,我必须将其转换为“澳大利亚东部标准时间”时区
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 2018-04-12
相关资源
最近更新 更多