【问题标题】:TimeZoneInfo.ConvertTime doesn't Convert anythingTimeZoneInfo.ConvertTime 不转换任何东西
【发布时间】:2010-09-18 02:25:47
【问题描述】:

使用 .net 4.0 在 win 7 上运行 asp.net mvc 2

我有一个控制器操作方法,它从一个表单接收 2 个 DateTime 对象。表单上的 UI 使用 jQueryUi 日期选择器(不确定是否适用)。

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

我想将其转换为 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) 来实现,这很好。但在以后的道路上,我需要这个应用程序更加灵活。

【问题讨论】:

  • 问题解决了吗?
  • 数据类型是什么。开始日期?

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


【解决方案1】:

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

 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() 更新

似乎 GetUtcOffset() 对于使用不同 DateTimeKind 值创建的 DateTimes 的工作方式完全相同。但是,我没有使用无效输入(即由于夏令时切换而不存在的日期)对其进行测试。我相信 DateTimeKind.Utc 在这里相当节省,但它可能适用于本地或未指定。

【讨论】:

    【解决方案2】:

    我找不到您的代码有任何问题...看起来它应该工作。您是否尝试过以下替代方法:

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

    【讨论】:

      【解决方案3】:

      试试这个代码

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

      这对我有用,也许你可以试一试。

      【讨论】:

        【解决方案4】:

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

        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.EndDateUnspecified 种类,那么它应该按预期工作。你可以改用TimeZoneInfo.ConvertTimeToUtc 让它稍微干净一些。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多