Eri*_*ick 5 .net timezone datetime asp.net-mvc-2
使用.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);
}
Run Code Online (Sandbox Code Playgroud)
我也试过了另一个版本,结果相同.
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),
}
Run Code Online (Sandbox Code Playgroud)
ScheduleData只是一个简单的ViewModel类,它有两个日期时间属性,叫做StartDate和EndDate.
我想强调一点,我不关心服务器的位置,我不在乎用户所在的位置.用户将始终在夏威夷时区输入时间,服务器应始终将该日期时间转换为UTC.
基本上我想要的是,在用户输入的时间增加10个小时(hawaiian到utc),我可以通过调用.AddHours(10)来实现这一点,这样就可以了.但是后来我将需要这个应用程序更灵活.
如果您想要更灵活的方法,请尝试以下操作:
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);
Run Code Online (Sandbox Code Playgroud)
无论您使用哪个时区,这都应该正常工作。顺便说一句:如果我是您,我会将开始日期和结束日期创建为 DateTimeKind.Utc(并将所有计划数据也存储为 UTC)。我不确定 GetUtcOffset() 如何处理未指定的时间类型......
GetUtcOffset() 的更新
对于使用不同 DateTimeKind 值创建的 DateTimes,GetUtcOffset() 的工作方式似乎完全相同。但是,我还没有使用无效输入(即由于夏令时切换而不存在的日期)对其进行测试。我相信 DateTimeKind.Utc 在这里相当保存,但它可能适用于本地或未指定。
| 归档时间: |
|
| 查看次数: |
2932 次 |
| 最近记录: |