2017-02-21 135 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