TimeZoneInfo.ConvertTime不转换任何内容

时间:2010-09-18 02:25:48

标签: .net datetime asp.net-mvc-2 timezone

使用.net 4.0

在win 7上运行asp.net mvc 2

我有一个控制器动作方法,它从一个表单接收2个DateTime对象。表单上的UI使用jQueryUi datepicker(不确定是否匹配)。

填写该表格的用户将始终输入夏威夷时区的日期/时间。

我想将其转换为UTC时间并将其存储在数据库中。

当我调用TimeZoneInfo.ConverTime(DateTime,TimeZoneInfo,TimeZoneInfo)时,它返回与我传入的完全相同的日期时间,而不进行任何转换。我检查了调试器,唯一改变的是它将DateTime.Kind属性更改为DateTimeKind.Utc。

public ActionResult New(ScheduleNew data){         
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById( "Hawaiian Standard Time" );

    DateTime start = TimeZoneInfo.ConvertTime(data.StartDate, tz, TimeZoneInfo.Utc);
    DateTime end = TimeZoneInfo.ConvertTime(data.EndDate, tz, TimeZoneInfo.Utc);
}

我也试过了另一个版本,结果相同。

public ActionResult New(ScheduleNew data){
    DateTime start = new DateTime( data.StartDate.Year, data.StartDate.Month, data.StartDate.Day, data.StartDate.Hour, data.StartDate.Minute, data.StartDate.Second, DateTimeKind.Unspecified );
    DateTime end = new DateTime( data.EndDate.Year, data.EndDate.Month, data.EndDate.Day, data.EndDate.Hour, data.EndDate.Minute, data.EndDate.Second, DateTimeKind.Unspecified );

    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById( "Hawaiian Standard Time" );

    StartDate = TimeZoneInfo.ConvertTime(start, tz, TimeZoneInfo.Utc);
    EndDate = TimeZoneInfo.ConvertTime(end, tz, TimeZoneInfo.Utc),
}

ScheduleData只是一个简单的ViewModel类,它有两个日期时间属性,叫做StartDate和EndDate。

我想强调一下,我不关心服务器的位置,我不在乎用户所在的位置。用户将始终在夏威夷时区输入时间,服务器应始终将该日期时间转换为UTC。

基本上我想要的是,在用户输入的时间增加10个小时(夏威夷到utc),我可以通过调用.AddHours(10)来实现这一点,这样就可以了。但是后来我将需要这个应用程序更灵活。

4 个答案:

答案 0 :(得分:4)

如果您想要更灵活的方法,请尝试以下方法:

 DateTime now = DateTime.UtcNow;

 TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time");
 TimeSpan utcOffset = timeZoneInfo.GetUtcOffset(now);
 DateTime hawaiianTime = new DateTime(now.Ticks + utcOffset.Ticks, DateTimeKind.Local);

无论您使用的是哪个时区,这都可以正常工作。顺便说一句:如果我是你,我会将开始和结束日期创建为DateTimeKind.Utc(并将所有计划数据存储为UTC)。我不确定GetUtcOffset()如何与未指定的时间类型一起工作......

更新GetUtcOffset()

对于使用不同DateTimeKind值创建的DateTime,似乎GetUtcOffset()的工作方式完全相同。但是,我没有用无效输入测试它(即由于夏令时切换而不存在日期)。我相信DateTimeKind.Utc在这里相当保存,但它可能适用于Local或Unspecified。

答案 1 :(得分:3)

我发现代码没有任何问题......看起来应该工作。您是否尝试过替代方案:

DateTime start = TimeZoneInfo.ConvertTimeToUtc(data.StartDat, tz);

答案 2 :(得分:2)

试试这段代码

var dt = new DateTime(YourOldDate.Ticks, DateTimeKind.Utc);
DateTime NewDate = TimeZoneInfo.ConvertTime(dt, TimeZoneInfo.Local);

这对我有用,可能是你可以尝试一下。

答案 3 :(得分:0)

似乎在代码中你没有对转换结果做任何事情。

public ActionResult New(ScheduleNew data){         
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById( "Hawaiian Standard Time" );

    DateTime start = TimeZoneInfo.ConvertTime(data.StartDate, tz, TimeZoneInfo.Utc);
    DateTime end = TimeZoneInfo.ConvertTime(data.EndDate, tz, TimeZoneInfo.Utc);
}

startend值已设置,但永远不会返回。实际上,这里根本没有返回任何值,所以这不应该编译。也许你没有表现出更多的东西。

无论如何,转换本身就没问题了。只要data.StartDatedata.EndDate具有Unspecified种,那么它应该按预期工作。您可以使用TimeZoneInfo.ConvertTimeToUtc来改善它。