C#DateTime - 使用fullcalendar.io处理时区的最佳方法?

时间:2018-05-15 15:17:47

标签: javascript c# datetime web-applications fullcalendar

我在使用日历的网络应用上工作。当我创建日历活动并选择上午10:00的开始时间时,该事件将保存为上午9:00(我在英国,我们目前是UTC + 1,我认为这是差异。

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

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

这是捕捉事件创建的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丢弃事件时,这是存储的时间吗?

1 个答案:

答案 0 :(得分:1)

在您不想在应用程序中执行某些日期计算之前,最安全的方法是将所有值存储在UTC中,然后将它们转换为客户端的时区 - 这样您的代码就赢了#39; t依赖于服务器实际执行它。

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

此方法通常不适用,因此请查看链接123以获取更多描述性信息。