我使用FullCalendar,我的事件对象的开始日期通过存储在数据库中
copiedEventObject.start = date;
我稍后检索它并用初始化我的日历
$.ajax({
type: "POST",
url: "Default.aspx/getCalendarEventsData",
data: {},
contentType: "application/json",
dataType: "json",
success: function (msg) {
// Replace the div's content with the page method's return.
calendarStoredEvents = $.map(msg.d, function (item) {
return {
title: item.EventTitle,
start: item.start,
id: item.EventID,
staffID: item.staffID
};
});
initializeCalendar(calendarStoredEvents);
}
});
item.start所在位置:
2013-06-30T16:00:00.000Z
现在的问题是 如果我在一个星期三存储事件对象,它会检索并显示在星期二 我读了一点,这与时区有关。我已经尝试添加:
ignoretimezone=false(失败,然后尝试将其切换为true)
ignoretimezone=true(同样失败,然后尝试添加时区)
currentTimezone:"亚洲/新加坡"(效果不佳)
这是存储在数据库中的值:
drop: function (date, allDay) { // this function is called when something is dropped
// retrieve the dropped element's stored Event Object
var originalEventObject = $(this).data('eventObject');
// we need to copy it, so that multiple events don't have a reference to the same object
var copiedEventObject = $.extend({}, originalEventObject);
// assign it the date that was reported
copiedEventObject.start = date;
copiedEventObject.allDay = allDay;
// render the event on the calendar
// the last `true` argument determines if the event "sticks" (http://arshaw.com/fullcalendar/docs/event_rendering/renderEvent/)
$('#calendar').fullCalendar('renderEvent', copiedEventObject, true);
// is the "remove after drop" checkbox checked?
if ($('#drop-remove').is(':checked')) {
// if so, remove the element from the "Draggable Events" list
$(this).remove();
}
// write to database
var eventID = copiedEventObject.id;
var staffID = copiedEventObject.staffID;
var start = copiedEventObject.start;
var end = copiedEventObject.end;
var allDay = copiedEventObject.allDay;
编辑
我的网站托管在Azure中,所以我想时间来自服务器:
当我丢弃事件时
(drop:函数(日期,allDay))
我使用了警报(启动),它显示(我的客户端时间)
2013年7月17日星期三00:00:00 GMT+0800(马来半岛标准时间)
我在我的C#代码后面写入数据库:
string strConnectionString = ConfigurationManager.ConnectionStrings["PCSDB"].ConnectionString;
SqlConnection conn = new SqlConnection(strConnectionString);
conn.Open();
using (SqlCommand sqlCommand = new SqlCommand("INSERT INTO CalendarData (EventID, staffID, start) VALUES (@EventID, @staffID, @start)", conn))
{
sqlCommand.Parameters.AddWithValue("@EventID", eventID);
sqlCommand.Parameters.AddWithValue("@staffID", staffID);
sqlCommand.Parameters.AddWithValue("@start", start);
int queryResult = sqlCommand.ExecuteNonQuery();
}
conn.Close();
当我检查数据库时,起始值变为
2013-07-16T16:00:00.000Z
编辑更改为datetime后,我在数据库中保存了正确的日期。
现在我在为对象转换它时遇到了一个问题。我用过:
var parsedDate = $.fullCalendar.parseDate(item.start);
var formatedDate = $.fullCalendar.formatDate(parsedDate, "dd-MM-yyyy");
通过
2013年7月17日上午12:00:00变为2014年5月7日
如何在数据库中存储时间并不相关。只关心如何通过API将时间传输到FullCalendar。假设您提供的"2013-06-30T16:00:00.000Z"
正是传递到FullCalendar中的字符串,那么您描述的行为是有意义的。您提供的UTC时间正在根据用户的本地时区进行调整。
FullCalendar在查看日历的人的本地时区中显示日历。没有在UTC或任何其他时区中查看日历的设置。这里有一些信息提到他们是"时区不可知论者"。从日历的绘制方式来看,你可以这样想,但在查看任何Date
对象时,你仍然会有本地时区,因为JavaScript就是这样工作的。
你有一些选择:
- 将
ignoreTimezone
选项设置为true
,并将输入值作为字符串而非日期传入 - 将值作为不带时区偏移的字符串传递(删除
Z
) - 将值作为具有正确时区偏移量的字符串传递给查看数据的人员
- 将值作为已针对本地时区调整的
Date
对象传递
currentTimezone
选项不是FullCalendar的一部分。它在gcal.js
插件中,用于通过gcal 1.0 api将FullCalender连接到Google Calendar。它只是将该参数作为查询字符串中的ctz
传递给Google。它只会影响从谷歌返回数据的方式。它在FullCalendar本身中不起任何作用。
在将日期保存到数据库之前,必须将其转换为formatDate格式。该事件将只接受这样的格式:dd MM yyyy 00:00:00。
我的select方法中有这个,所以可能您没有正确地获取事件对象。这对我来说很好。
select: function(start, end, allDay){
var startdate = $.fullCalendar.formatDate(start, "dd-MM-yyyy");
var enddate = $.fullCalendar.formatDate(end, "dd-MM-yyyy");
alert(startdate);
alert(enddate);
}
这将显示一个类似2013年7月15日的日期。