转换时区之间的时间,无法完成转换

时间:2017-02-21 05:02:15

标签: c# timezone utc

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

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 \ nParameter name:sourceTimeZone

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您已指定From timezone。但我无法找到时区。您可以使用以下代码转换时区之间的时间。

        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,运行代码的系统的本地时区不是&#34; AUS Eastern Standard Time&#34;。如果传递给ConvertTimeToUtc方法的日期类型为Local,则该方法将期望sourceTimeZone参数与运行代码的系统的本地时区匹配。

您可以使用以下代码将dateTo的Kind属性设置为UnSpecified。通过这个你不会得到例外:

DateTime.SpecifyKind(dateTo, DateTimeKind.Unspecified);