2011-04-20 16 views
12

मैं इसे किसी भी तरह गलत कर रहा हूं। मैं Fullcalendar के साथ टाइमज़ोन पर ट्राइप कर रहा हूं। मैंने ignoreTimezone को सही और गलत पर सेट करने का प्रयास किया है, लेकिन यह कोई फर्क नहीं पड़ता। यह दो स्थानों पर नीचे दिए गए कोड में है क्योंकि मुझे उस दस्तावेज़ से निश्चित नहीं था जहां यह जाता है।फुल कैलेंडर और टाइमज़ोन। सहायता, मैं इसे गलत कर रहा हूं

मेरा डेटा स्रोत एक छिपी हुई फॉर्म फ़ील्ड है। डेटा FullCalendar को 5 घंटे (सीडीटी) जोड़कर समायोजित किया जाता है। से FullCalendar में डेटा 5 घंटे को हटाकर समायोजित नहीं किया जाता है।

बैक-एंड पर, मैं सिर्फ बचत कर रहा हूँ और यह प्रसंस्करण के बिना JSON स्ट्रिंग लौट (या यहां तक ​​कि इसे डीकोड)

Page Load: 
    Data In: Empty, no data 
    Data Edit: drag from noon to 2pm (CDT), then submit form 
    Data Out: Use clientEvent to get data, and JSON.stringify to put into form field. 
    [{"id":6844,"title":"Open","start":"2011-04-19T17:00:00.000Z","end":"2011-04-19T19:00:00.000Z","allDay":false}] 

Page Load (after submitting form): 
    Data In: Use JSON.parse to load data from hidden form field. This is the incoming data, but the event is shifted to 5pm (CDT) in the control. 
    [{"id":6844,"title":"Open","start":"2011-04-19T17:00:00.000Z","end":"2011-04-19T19:00:00.000Z","allDay":false}] 
    Data Out: Without changing the control, it's now: 
    [{"id":6844,"title":"Open","start":"2011-04-19T22:00:00.000Z","end":"2011-04-20T00:00:00.000Z","allDay":false}] 

मैं सेटअप Fullcalendar इस तरह:

// Fullcalendar for business hours page 

jQuery(document).ready(function() { 

    jQuery('#edit-submit').bind("click", business_hours_set); 
    jQuery('#edit-preview').bind("click", business_hours_set); 

    jQuery('#calendar').fullCalendar({ 

    // configure display 
    header: { 
     left: '', 
     center: '', 
     right: '' 
    }, 
    ignoreTimezone: false, 
    defaultView: 'agendaWeek', 
    allDaySlot: false, 
    firstHour: 8, 

    // configure selection for event creation 
    selectable: true, 
    selectHelper: true, 
    select: business_hours_add, 

    // configure data source 
    editable: true, 
    eventSources: [ 
    { 
     events: jQuery.parseJSON(jQuery('#fullcalendar_data').val()), 
     color: '#992B0A', 
     textColor: 'white', 
     ignoreTimezone: false 
    } 
    ], 

    // configure editing 
    eventClick: function(calEvent) { 
     business_hours_delete(calEvent.id); 
    } 
    }); 
    alert(jQuery('#fullcalendar_data').val()); 
}); 

function business_hours_add(startDate, endDate) { 
    var calendar = jQuery('#calendar'); 
    var newid = Math.ceil(Math.random()*64000); 
    calendar.fullCalendar('renderEvent', 
    { 
    id: newid, 
    title: "Open", 
    start: startDate, 
    end: endDate, 
    allDay: false 
    }, 
    true // make the event "stick" 
); 
    calendar.fullCalendar('unselect'); 
} 

var business_hours_selectedId = -1; 
function business_hours_delete(id) { 

    business_hours_selectedId = id; 

    jQuery("#dialog-confirm").dialog({ 
    resizable: false, 
    height:160, 
    modal: true, 
    buttons: { 
     "Yes, delete!": function() { 
     calendar = jQuery('#calendar'); 
     calendar.fullCalendar('removeEvents', business_hours_selectedId); 
     jQuery(this).dialog("close"); 
     }, 
     Cancel: function() { 
     jQuery(this).dialog("close"); 
     } 
    } 
    }, id); 
} 

function business_hours_set() { 
    var data = jQuery('#calendar').fullCalendar('clientEvents'); 

    // data is cyclical. Create a new data structure to stringify. 
    var ret = []; 
    for(var i=0; i<data.length; i++) { 
    var datum = { 
     id: data[i].id, 
     title: data[i].title, 
     start: data[i].start, 
     end: data[i].end, 
     allDay: data[i].allDay 
    } 
    ret[i] = datum; 
    } 
    // stringify and return 
    jQuery('#fullcalendar_data').val(JSON.stringify(ret)); 
    alert(JSON.stringify(ret)); 
} 

मैं क्या गलत कर रहा हूं?

अग्रिम धन्यवाद, माइक

+0

माइक के पास आपको इसका समाधान मिला है, मुझे भी एक ही समस्या का सामना करना पड़ रहा है – Devjosh

उत्तर

2

आप यूटीसी दिनांक के रूप में CDT से समायोजित दिनांकों serializing कर रहे हैं ताकि जब वे वापस वे मिल CDT को फिर से समायोजित, और इतने पर में पढ़ा जाता है (एक प्रकार से 5 घंटे की पाली में हो रही)।

क्योंकि जेएस डेट ऑब्जेक्ट्स पर टाइमज़ोन सेट करने का कोई तरीका नहीं है, फुलकेल्डर उन्हें आंतरिक रूप से यूटीसी तिथियों के रूप में दर्शाता है, लेकिन इनपुट समय पर टाइमज़ोन ऑफसेट के लिए समायोजित करता है।

$.fullCalendar.parseISO8601('2011-04-19T17:00:00.000-05:00'); 
// Tue Apr 19 2011 22:00:00 GMT+0000 (GMT) <-- note time shift 

यही कारण है कि, जब आप JSON को क्रमानुसार, आप "ज़ुलु" (UTC) समय क्षेत्र के साथ एक स्ट्रिंग मिलती है:

var dt = $.fullCalendar.parseISO8601('2011-04-19T17:00:00.000-05:00'); 
JSON.stringify(dt); // "2011-04-19T22:00:00.000Z" 

आप अपने समय क्षेत्र के वापस तारीख की जरूरत है। यह Fullcalendar तरह नहीं दिखता है यह तो आप काम करने के लिए करने की आवश्यकता होगी है:

// detect local timezone offset 
var localoffset = (new Date()).getTimezoneOffset(); 
// "unadjust" date 
ret = new Date(ret.valueOf() + (localoffset * 60 * 1000)); 

// serialize 
function pad (n) { return String(n).replace(/^(-?)(\d)$/,'$10$2'); } 
JSON.stringify(ret) 
    // replace Z timezone with current 
    .replace('Z', pad(Math.floor(localoffset/60))+':'+ pad(localoffset % 60)); 

// should result in something like: "2011-04-21T19:00:00.000-05:00" 

इस Fullcalendar का उपयोग कर के हल के लिए एक बेहतर तरीका हो सकता है लेकिन मैं इसे से परिचित नहीं हूँ।

कोड अनचाहे है: मैं जीएमटी में नो-डीएसटी के साथ रहता हूं और वास्तव में यह काम करने के लिए अपने सिस्टम के साथ गड़बड़ नहीं करना चाहता (वाईएमएमडब्लू)। :-)

+0

हाय, उत्तर के लिए धन्यवाद। मैं टाइमज़ोन मुद्दा (थोड़ा) समझता हूं, लेकिन FullCalendar का व्यवहार नहीं। डेटा जो मैं पूरा कैलेंडर में डाल रहा हूं वह है ज़ुलू समय: उदा। [{ "Id": 6844, "शीर्षक": "खोलें", "शुरू": "2011-04-19T17: 00: 00.000Z", "अंत": "2011-04-19T19: 00: 00.000Z", "ऑलडे": झूठा}] लेकिन ऐसा लगता है कि यह 5 घंटे तक भी समायोजित करता है! 22: 00Z पर शुरू करने के लिए इसे स्थानांतरित करना। मैं मूल रूप से डेटा को पूर्ण कैलेंडर से बाहर ले जाता हूं, और इसे वापस खिलाता हूं, जिसके परिणामस्वरूप यह 5 घंटे की शिफ्ट होती है। – Mike

2

मेरे पास फुल कैलेंडर में एक ही समय-समय पर था। सर्वर पर अपना टाइमज़ोन देखें, जब मैंने इसे स्वयं बदल दिया तो यह मेरी मदद करता है। आप कुछ मायनों में यह करने के लिए कोशिश कर सकते हैं:

सेरेर पर:

[जड़ @ mx ~] # mv/etc/स्थानीयसमय/etc/स्थानीयसमय।वर्ष

[जड़ @ mx ~] # ln -s/usr/share/zoneinfo/यूरोप/मास्को/etc/स्थानीयसमय

या PHP स्क्रिप्ट (जो JSON स्ट्रिंग रिटर्न) में:

date_default_timezone_set ('यूरोप/मॉस्को');

पीएस अपने मूल्यों में "यूरोप/मॉस्को" को बदलने के लिए मत भूलना :-)

फिर आपको अपना समय समय नए समय क्षेत्र ("दिनांक" कमांड) में सेट करना होगा;

संबंधित मुद्दे