【发布时间】:2018-05-15 15:17:46
【问题描述】:
我正在开发一个使用日历的网络应用程序。当我创建日历事件并选择上午 10:00 的开始时间时,该事件将保存为上午 9:00(我位于英国,目前我们是 UTC+1,我认为这是造成差异的原因。
我想知道处理此问题的最佳方法,并确保任何时区的用户在日历上选择上午 10:00 时,会将上午 10:00 写入数据库。
以下是相关的代码。我对 Start 和 Finish 变量特别感兴趣,它们都是 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(),当保存事件时会触发该警报。它在此示例中显示了这一点:
因此,我假设 10:00+0100 等于上午 9:00,这就是为什么我的活动会以“不同”时间记录下来的原因。任何人都可以建议处理此问题的最佳方法,并可能提供一些示例代码,以便如果用户在上午 10:00 放弃事件,那就是存储的时间?
【问题讨论】:
-
不要使用 DateTime,使用 DateTimeOffset - 包括时区信息。
-
是你调用
.format()的那些moment.js对象吗?您能否详细说明它们的来源以及创建Date对象的原因?另外,这最终如何到达服务器端?很多步骤这里没有展示... -
@AvoNappo 这不是真的。
DateTime和DateTimeOffset都不包含时区信息。另外,DateTimeOffset包含 UTC offset 值,但这并不意味着它包含时区信息。仅基于 UTC 偏移值不可能知道时区信息。
标签: javascript c# datetime web-applications fullcalendar