2017-02-21 101 views
0

我试图从不同的服务和价值时区之间进行转换的时间转换时间时区之间,该转换无法完成

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是正在添加10:28 2017年2月20日: 27日上午,2017年2月21日上午04点56分31秒

我得到异常:

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

+0

'dateTo'是如何初始化的?来自客户?来自db?硬编码?来自其他服务? 'Am'是故意还是错字? –

+0

你的'dateTo'似乎不是有效的,否则它不可能被转换为其他时区。 – Mairaj

+0

sr关于我更新了我的问题 – beginerdeveloper

回答

1

使用DateTime.SpecifyKind功能设置类来指定,

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 
+0

谢谢它正在工作 – beginerdeveloper

+0

不客气。 –

+0

另外,你可能想弄清楚你的代码首先是如何得到一个附加在'dateTo'上的'DateTimeKind.Local'。例如,如果'dateTo'从调用到'DateTime.Now'时被填充,这个特定的答案就不是正确的解决方案。 –

0

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

 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); 
+0

但dateFrom和dateTo是相同的时区,我必须将其转换为“AUS东部标准时间”时区 – beginerdeveloper