关于c#:转换时区之间的时间,无法完成转换

Converting Times Between Time Zones, The conversion could not be completed

我想在时区之间转换时间

1
2
3
4
5
6
7
8
9
10
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

我有例外:

The conversion could not be completed because the supplied DateTime did not have the Kind property set correctly. For example, when the Kind property is DateTimeKind.Local, the source time zone must be TimeZoneInfo.Local.

Parameter name: sourceTimeZone


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

1
2
3
4
5
6
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


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

1
2
3
4
5
        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);

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

1
2
3
4
        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。 这样你就不会得到例外:

1
DateTime.SpecifyKind(dateTo, DateTimeKind.Unspecified);