首页 > 解决方案 > C# DateTime - 使用 fullcalendar.io 处理时区的最佳方法?

问题描述

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

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

这是相关的代码位。我对整个都是 Datetime 数据类型的Start和变量特别感兴趣:Finish

这是捕捉事件创建的 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()在保存事件时触发。它为此示例显示了这一点:

点击查看提醒图片

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

标签: javascriptc#datetimeweb-applicationsfullcalendar

解决方案


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

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

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


推荐阅读