2010-04-10 9 views
10

मैं जावा डेवलपर हूं और मुझे सरलडेटाफॉर्मैट क्लास में उपयोग किया जाता है जो मुझे किसी टाइमआउट को सेटिंग्स द्वारा किसी भी प्रारूप में प्रारूपित करने की अनुमति देता है।विभिन्न टाइमज़ोन के लिए जावास्क्रिप्ट दिनांकफॉर्मेट

Date date = new Date(); 

SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); 

sdf.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); 
System.out.println(sdf.format(date)); // Prints date in Los Angeles 

sdf.setTimeZone(TimeZone.getTimeZone("America/Chicago")); 
System.out.println(sdf.format(date)); // Prints same date in Chicago 

SimpleDateFormat जावा में एक सुंदर साफ समाधान है लेकिन दुर्भाग्य से मुझे जावास्क्रिप्ट में कोई भी समान विकल्प नहीं मिल रहा है।

मैं जावास्क्रिप्ट में दिनांक प्रोटोटाइप को ठीक से करने के लिए विस्तार कर रहा हूं। मेरे पास यूनिक्स प्रारूप में तिथियां हैं लेकिन मैं उन्हें अलग-अलग समय क्षेत्रों में प्रारूपित करना चाहता हूं।

Date.prototype.format = function(format, timezone) { 
    // Now what? 
    return formattedDate; 
} 

मैं एक साफ रास्ता बल्कि एक हैक की तुलना में यह करने के लिए की तलाश में हूँ।

धन्यवाद

+0

कोई आसान तरीका यह करने के लिए नहीं है

यहाँ एक उदाहरण के साथ एक JSfiddle है। जावास्क्रिप्ट टाइमज़ोन के लिए बहुत कम या कोई समर्थन नहीं है। मेरे द्वारा बनाए गए कैलेंडर ऐप में, मेरे पास दिनांक और समय क्षेत्र को संभालने के लिए कोड के कुछ पृष्ठों से अधिक था, जिसमें एक बड़ी एक्सएमएल फ़ाइल भी शामिल थी जिसे सर्वर से डाउनलोड किया जाना था जिसमें शहरों और उनके संबंधित क्षेत्र शामिल थे - और उनके डेलाइट बचत समय नियम। – mwilcox

+0

मान लें कि मैं जीएमटी रॉ ऑफसेट प्रदान करता हूं, क्या इससे कोई आसान हो जाएगा? – Elie

उत्तर

3

जावास्क्रिप्ट स्थानीय समय की तुलना में अन्य समय क्षेत्र के लिए समर्थन में नहीं बनाया गया है। आप केवल स्थानीय समय या यूटीसी समय में एक तिथि व्यक्त कर सकते हैं। दिनांक वस्तु के समय क्षेत्र ऑफ़सेट को बदलने का कोई तरीका नहीं है।

इस प्रकार, आपकी समस्या का समाधान करने के लिए कोई "साफ" तरीका नहीं है।

+0

आपके द्वारा लिंक किए गए TechRepublic पृष्ठ पर टिप्पणियां इंगित करती हैं कि वहां प्रस्तावित समाधान (और स्क्रिप्ट) बहुत खराब और गलत हैं ... – blong

1

अपनी खुद की सामग्री मत लिखो; बस मिल datejs: http://www.datejs.com/

आप पता लगा सकते हैं कि क्या समय क्षेत्र ऑफसेट इस तरह निष्पादन वातावरण में करने के लिए सेट है:

var local = new Date(); 
var utc = Date.UTC(local.getFullYear(), local.getMonth(), local.getDate(), local.getHours(), local.getMinutes(), local.getSeconds(), local.getMilliseconds()); 
var tz = (utc - local.getTime())/(60 * 60 * 1000); 
+1

लक्ष्य टाइमज़ोन को संभालना है, डेटजेएस ऐसा प्रतीत नहीं होता है। – Elie

+1

2007 में अल्फा रिलीज और तब से कोई गतिविधि नहीं है। – nilskp

1

तुम सिर्फ कच्चे TZ कुछ भी नहीं समायोजन के बारे में वास्तव में जटिल है गुजर रहे हैं घंटे। नीचे मेरा उदाहरण संक्षेप में संक्षेप में है। आप कितने पैटर्न को संभालेंगे इस पर निर्भर करते हुए आपका काफी लंबा हो सकता है।

Date.prototype.format = function(format, tzAdjust) { 
    // adjust timezone 
    this.setHours(this.getHours()+tzAdjust) 
    // pad zero helper - return "09" or "12" 
    var two = function(s){ return s+"".length==1 ? "0"+s : s+""; } 
    // replace patterns with date numbers 
    return format.replace(/dd|MM|yyyy|hh|mm|ss/g, function(pattern){ 
     switch(pattern){ 
      case "d" : return this.getDate(); 
      case "dd" : return two(this.getDate()); 
     } 
    }); 
} 
+1

यह एक बहुत साफ समाधान नहीं है। क्योंकि मान लें कि आप दो बार एक ही तारीख को प्रारूपित करना चाहते हैं, इसे दो बार समायोजित किया जाएगा। दूसरी ओर, GetHours उपयोगकर्ता के टाइमज़ोन पर घंटे लौटाता है, कच्चे ऑफसेट पर्याप्त नहीं है, आपको उपयोगकर्ता के टाइमज़ोन पर भी विचार करना होगा (getTimezoneOffset())। वैसे भी, setHours का उपयोग करके, आप उस तारीख को बदल देंगे जो तिथियों को संभालने का गलत तरीका है। – Elie

1

(कभी तो थोड़ा) mwilcox के सुझाव को बेहतर बनाने के लिए प्रयास कर:

Date.prototype.format = function(format, tzAdjust) { 

    // get/setup a per-date-instance tzDate object store 
    var tzCache = this.__tzCache = this.__tzCache || (this.__tzCache = {}); 

    // fetch pre-defined date from cache 
    var tzDate = tzCache[tzAdjust]; 
    if (!tzDate) 
    { 
     // on miss - then create a new tzDate and cache it 
     tzDate = tzCache[tzAdjust] = new Date(this); 
     // adjust by tzAdjust (assuming it's in minutes 
     // to handle those weird half-hour TZs :) 
     tzDate.setUTCMinutes(tzDate.getUTCMinutes()+tzAdjust); 
    } 

    return format.replace(/dd|MM|yyyy|hh|mm|ss/g, function(pattern){ 
       // replace each format tokens with a value 
       // based on tzDate's corresponding UTC property 
      }); 
} 
1

आप स्पष्ट रूप से एक में दो सवाल पूछ रहे हैं, स्वरूपण और समय क्षेत्र। उन्हें अलग से संबोधित करने की जरूरत है। स्वरूपण बहुत छोटा है, यदि इसके लिए कोई अन्य उत्तर नहीं करेगा तो आपको अधिक विशिष्ट होना होगा।

समय और समय क्षेत्र के लिए के रूप में, यदि आप अपने सर्वर इंजेक्षन UTC समय, अधिमानतः मिलीसेकेंड में यूनिक्स समय के रूप में, जावास्क्रिप्ट में है, तो आप उस क्लाइंट मशीन पर समय के लिए तुलना कर सकते हैं, और इस तरह कैसे बाहर काम यूटीसी से दूर ग्राहक है। फिर आप किसी भी समय क्षेत्र के समय की गणना कर सकते हैं।

संपादित करें: मुझे वास्तव में पता नहीं था कि जावास्क्रिप्ट ने यूटीसी समय में भी बनाया था जब तक कि मैंने इंटरनेट पर साफ नहीं किया।

किसी भी मामले में, मुझे लगता है यह आप चाहते हैं चाहते हैं:

Date.prototype.format=function(format,timezone){ 
    var obj=new Date(this.getTime()+this.getTimezoneOffset()*60000+timezone*3600000); 
    var two=function(s){ 
     return s<10?"0"+s:s+""; 
    } 
    return format.replace(/dd|MM|yyyy|hh|mm|ss/g, function(pattern){ 
     switch(pattern){ 
      case "dd" : return two(obj.getDate()); 
      case "MM" : return two(obj.getMonth()+1); 
      case "yyyy" : return obj.getFullYear(); 
      case "hh" : return two(obj.getHours()); 
      case "mm" : return two(obj.getMinutes()); 
      case "ss" : return two(obj.getSeconds()); 
     } 
    }); 
} 

आप और अधिक पैटर्न में जोड़ सकते हैं अगर आप की जरूरत है।

+0

ई बिजनेस, मैं एक में दो प्रश्न नहीं पूछ रहा हूं। कई प्रोग्रामिंग भाषाओं में, डेट ऑब्जेक्ट टाइमज़ोन के साथ नहीं बदलता है, वैसे ही यह उस बदलाव को प्रदर्शित करता है। तारीख अब दुनिया में हर जगह समान है लेकिन यह अलग-अलग प्रदर्शित होती है। यदि आप मेरे जावा उदाहरण को देखते हैं, तो ध्यान दें कि मैं दो अलग-अलग दिनांक प्रारूपों का उपयोग करके उसी दिनांक वस्तु को कैसे प्रदर्शित कर रहा हूं। – Elie

2

सामान्य तिथि के लिए आईएसओ विस्तारित प्रारूप YYYY-MM-DD है, और समय के लिए एचएच: मिमी: एसएस है। या तो प्रारूप को दुनिया भर में, स्पष्ट रूप से समझा जा सकता है।

यह भी देखें: http://jibbering.com/faq/#dates

+2

समय क्षेत्र के बिना नहीं। – nilskp

0

यह एक पुरानी सवाल है, लेकिन जब से मुझे मिल गया:

के रूप में उल्लेख किया है, वहाँ कुछ भी नहीं उचित निर्मित है।

libs के लिए, Moment.js के लिए है। http://jsfiddle.net/kunycrkb/

एक ही कोड इनलाइन:

var m = moment("2014-06-01T13:05:00Z"); 
var f = "HH:mm z"; 

$("#results").text(m.tz("UTC").format(f) + " is " + m.tz("EST").format(f) + "!"); 
संबंधित मुद्दे