【问题标题】:C# DateTime - best way to handle timezones with fullcalendar.io?C# DateTime - 使用 fullcalendar.io 处理时区的最佳方法?
【发布时间】:2018-05-15 15:17:46
【问题描述】:

我正在开发一个使用日历的网络应用程序。当我创建日历事件并选择上午 10:00 的开始时间时,该事件将保存为上午 9:00(我位于英国,目前我们是 UTC+1,我认为这是造成差异的原因。

我想知道处理此问题的最佳方法,并确保任何时区的用户在日历上选择上午 10:00 时,会将上午 10:00 写入数据库。

以下是相关的代码。我对 StartFinish 变量特别感兴趣,它们都是 Datetime 数据类型:

这是捕捉事件创建的Javascript:

eventDrop: function (calEvent, dayDelta, minuteDelta, allDay, revertFunc) {
                var event = {};
                event.EventID = calEvent.eventid;
                event.StatusString = "Update";
                event.CustomerID = calEvent.customerid;
                event.ProductID = calEvent.productid;
                event.Title = calEvent.title;
                event.Start = new Date(calEvent.start.format()); 
                event.Finish = new Date(calEvent.end.format());
                event.EventNote = calEvent.eventNote;
                event.ProductValue = calEvent.ProductValue;

传递给 SQL 处理程序

                SqlCommand cmd = new SqlCommand();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = m_Connection;
                cmd.CommandText = "usp_ATP_Calendar_InsertUpdateEvent";
                [...other params...]
                cmd.Parameters.AddWithValue("@Start", eve.Start);
                cmd.Parameters.AddWithValue("@Finish", eve.Finish);
                cmd.Parameters.AddWithValue("@EventNote", eve.EventNote);

                cmd.ExecuteNonQuery();

我在网页上添加了一个警报,它只是event.Start.toString(),当保存事件时会触发该警报。它在此示例中显示了这一点:

Click for alert image

因此,我假设 10:00+0100 等于上午 9:00,这就是为什么我的活动会以“不同”时间记录下来的原因。任何人都可以建议处理此问题的最佳方法,并可能提供一些示例代码,以便如果用户在上午 10:00 放弃事件,那就是存储的时间?

【问题讨论】:

  • 不要使用 DateTime,使用 DateTimeOffset - 包括时区信息。
  • 是你调用.format()的那些moment.js对象吗?您能否详细说明它们的来源以及创建Date 对象的原因?另外,这最终如何到达服务器端?很多步骤这里没有展示...
  • @AvoNappo 这不是真的。 DateTimeDateTimeOffset 都不包含时区信息。另外,DateTimeOffset 包含 UTC offset 值,但这并不意味着它包含时区信息。仅基于 UTC 偏移值不可能知道时区信息。

标签: javascript c# datetime web-applications fullcalendar


【解决方案1】:

除非您不想在应用程序中执行某些日期计算,否则最安全的方法是将所有值存储为 UTC,然后将它们转换为客户端的时区——这样您的代码实际上不会依赖于服务器执行它。

这意味着您不应该真正将上午 10:00 保存到您的商店,您首先将其转换为 UTC 会计客户的时区。然后在您想显示时将其转换回客户的时区。

这种方法并不普遍适用,因此请考虑查看链接123 以获得更多描述性信息。

【讨论】:

  • 此建议适用于时间戳,例如记录发生的事情,但不是处理调度的最佳方式。您链接到的最佳实践文章中对此进行了介绍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2013-04-17
  • 2011-05-21
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多