我正在尝试在时区之间转换时间
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);
}
从不同的服务和价值开始的dateto和DateTo是2/20/2017 10:28:27 AM,2/21/2017 4:56:31 AM
我有例外:
由于提供的DateTime未正确设置固定属性,因此无法完成转换。例如,当属性属性为dateTimeKind.local时,源时区必须是timezoneinfo.local。
使用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
您已经从时区指定了。但是我找不到时区。您可以使用以下代码在时区之间转换时间。
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的类属性设置为本地,并且该代码正在运行的系统的本地时区不是" Aus Aus Eastern Standard Time"。如果传递给转换为tocttimetoutc方法的日期是本地的,则该方法将期望SUCCETIMEZONE参数与代码正在运行的系统的本地时区匹配。
您可以使用以下代码将DateTo的属性设置为未指定的属性。通过这种情况,您不会例外:
DateTime.SpecifyKind(dateTo, DateTimeKind.Unspecified);