उपयोगकर्ता के स्थानीय प्रारूप और समय ऑफसेट में दिनांक / समय प्रदर्शित करें


167

मैं चाहता हूं कि सर्वर हमेशा HTML में यूटीसी में तारीखों की सेवा करे, और क्लाइंट साइट पर जावास्क्रिप्ट है इसे उपयोगकर्ता के स्थानीय समयक्षेत्र में परिवर्तित करें।

यदि मैं उपयोगकर्ता के स्थानीय दिनांक प्रारूप में आउटपुट कर सकता हूं तो बोनस।

जवाबों:


165

UTC तारीख से शुरू करने के लिए सबसे मूर्खतापूर्ण तरीका लगता है कि एक नई Dateवस्तु बनाना है और setUTC…इसे उस तिथि / समय पर सेट करने के तरीकों का उपयोग करना है जिसे आप चाहते हैं।

फिर विभिन्न toLocale…Stringतरीके स्थानीय आउटपुट प्रदान करेंगे।

उदाहरण:

// This would come from the server.
// Also, this whole block could probably be made into an mktime function.
// All very bare here for quick grasping.
d = new Date();
d.setUTCFullYear(2004);
d.setUTCMonth(1);
d.setUTCDate(29);
d.setUTCHours(2);
d.setUTCMinutes(45);
d.setUTCSeconds(26);

console.log(d);                        // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT)
console.log(d.toLocaleString());       // -> Sat Feb 28 23:45:26 2004
console.log(d.toLocaleDateString());   // -> 02/28/2004
console.log(d.toLocaleTimeString());   // -> 23:45:26

कुछ संदर्भ:


1
फ़ायरफ़ॉक्स में, toLocateDateString()कुछ ऐसा दिखता है, जो 'रविवार, 12 जनवरी, 2014' जैसा दिखता है ..
ब्लूराजा - डैनी पफ्लुगुएफ्ट

1
हम्म हाँ, यह काफी गंभीर समस्या है। इन विधियों का उपयोग करने से काम नहीं चलेगा यदि आप चाहते हैं कि तारीखें ब्राउज़रों में समान दिखें। ज्ञात कोई विकल्प?
जोश मैक

6
उपरोक्त आरंभीकरण का एकल-पंक्ति संस्करण:var d = new Date(Date.UTC(2004,1,29,2,45,26));
m1kael

4
यह विचार करने योग्य हो सकता है कि Chrome (v35 के अनुसार) toLocaleString()फ़ंक्शन में उपयोगकर्ता के स्थान को ध्यान में नहीं रखता है ।
बीनो

8
मुझे खेद है, लेकिन यह विधि नीचे (मैं ऑस्ट्रेलिया में हूं) काम नहीं करता, जब मैं उपरोक्त कोड चलाता हूं तो तारीख अमेरिकी प्रारूप में प्रदर्शित होती है। इसके अलावा एमडीएन का कहना है कि 'इस्तेमाल किया जाने वाला तार और लौटाए गए स्ट्रिंग का रूप पूरी तरह से कार्यान्वयन पर निर्भर है'।
त्रिगर्त

65

नई परियोजनाओं के लिए, बस moment.js का उपयोग करें

यह प्रश्न बहुत पुराना है, इसलिए उस समय क्षणों का अस्तित्व नहीं था, लेकिन नई परियोजनाओं के लिए, यह इस तरह के कार्यों को बहुत सरल करता है।

यूटीसी से अपनी तिथि स्ट्रिंग को पार्स करना सबसे अच्छा है (अपने ब्राउज़र पर लगातार परिणाम प्राप्त करने के लिए सर्वर पर ISO-8601 संगत स्ट्रिंग बनाएं ):

var m = moment("2013-02-08T09:30:26Z");

अब बस mअपने अनुप्रयोग में उपयोग करें, प्रदर्शन के संचालन के लिए स्थानीय समयक्षेत्र में क्षणों की चूक। दिनांक और समय मानों को प्रारूपित करने या इसके अंश निकालने के कई तरीके हैं ।

तुम भी इस तरह से उपयोगकर्ताओं को एक पल वस्तु प्रारूप कर सकते हैं:

m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-us

एक अलग समय क्षेत्र (जैसे कि न तो स्थानीय एक और न ही यूटीसी) में एक क्षण.जेएस ऑब्जेक्ट को बदलने के लिए, आपको क्षण की आवश्यकता होगी । समय सारणी विस्तार । उस पृष्ठ के भी कुछ उदाहरण हैं, यह उपयोग करने के लिए बहुत सरल है।


आप यह सब कैसे जोड़ते हैं? m.utcOffset (ऑफसेट) .format ('LLL') काम नहीं करता है।
बार्ट

चाहिए Luxon या Day.js सुझाव पुस्तकालय अब हो सकता है?
होमर

1
मैं जोड़ने का सुझाव देता हूंFor old projects, just use jQuery
Xenos

क्रोम पर काम नहीं करता है - फिर भी कंप्यूटर के स्थानीय सेटिंग्स में 24 घंटों का समय निर्धारित होने के बावजूद भी मैं am / pm दिखाता हूं
हमें

20

आप new Date().getTimezoneOffset()/60समयक्षेत्र के लिए उपयोग कर सकते हैं । toLocaleString()उपयोगकर्ता के स्थान का उपयोग करते हुए एक तिथि प्रदर्शित करने के लिए एक विधि भी है ।

यहाँ पूरी सूची है: डेट्स के साथ काम करना


एक उपयोगकर्ता जिस प्रारूप की अपेक्षा कर सकता है, उसमें तारीखें प्रस्तुत करने के लिए toLalealeString बेहद अविश्वसनीय है। यहां तक ​​कि जहां आईएसओ 402 का समर्थन किया गया है, यह अभी भी बहुत अविश्वसनीय है और एक भाषा पर प्रारूप को आधार बनाता है, स्थानीय नहीं।
RobG

@RobG के बजाय समाधान क्या है toLocaleString?
user924

@ user924-आप एक पुस्तकालय का उपयोग कर सकते हैं, वहाँ से चुना बहुत हैं। ToLocaleString के साथ समस्या यह है कि विभिन्न कार्यान्वयन विभिन्न भाषाओं और क्षेत्रों के लिए समर्थन के विभिन्न स्तरों के साथ अलग-अलग परिणाम देते हैं। उदाहरण के लिए, मेरी सिस्टम डिफ़ॉल्ट भाषा en-US नहीं है, लेकिन कुछ ब्राउज़रों के लिए toLocaleString का डिफ़ॉल्ट प्रारूप US प्रारूप है, अन्य लोग मेरी सिस्टम भाषा का सम्मान करते हैं। यह टाइमज़ोन नामों के साथ ही है, केवल बदतर के रूप में वे बिल्कुल भी मानकीकृत नहीं हैं। :-(
रोबग

7

एक बार जब आप अपनी तिथि का निर्माण कर लेते हैं, तो यहां रूपांतरण के लिए एक स्निपेट है:

फ़ंक्शन एक UTC स्वरूपित दिनांक ऑब्जेक्ट और स्वरूप स्ट्रिंग लेता है।
आपको एक Date.strftimeप्रोटोटाइप की आवश्यकता होगी ।

function UTCToLocalTimeString(d, format) {
    if (timeOffsetInHours == null) {
        timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
    }
    d.setHours(d.getHours() + timeOffsetInHours);

    return d.strftime(format);
}

6
आपने कहां से स्ट्रगल किया?
अनुज पांडेय

क्या दिन निर्धारित करने से किसी दिनांक वस्तु के दिन / तिथि / वर्ष भागों पर कोई प्रभाव पड़ता है? नहीं लगती।
क्रिस्टोकिवी

1
@ ChristoKiwi- सेटहॉर्स को दिया गया मान यह है कि पूर्णांक getTimezoneOffset()/60एक अंश लौटा सकता है (उदाहरण के लिए +05: 30 की भारत ऑफसेट 5.5)। दशमलवों को काट दिया जाता है। अन्यथा, घंटे सेट करने से अन्य मान अपडेट होते हैं (घंटे 48 से सेट होते हैं और देखते हैं कि क्या होता है)।
रोबग

7

जेएस में स्थानीय संपत्ति समय को प्रारूपित करने के लिए कोई सरल और क्रॉस प्लेटफॉर्म तरीके नहीं हैं, प्रत्येक संपत्ति को ऊपर बताए अनुसार परिवर्तित करना।

यहां एक त्वरित हैक है जिसका उपयोग मैं स्थानीय YYYY-MM-DD प्राप्त करने के लिए करता हूं। ध्यान दें कि यह एक हैक है, क्योंकि अंतिम तिथि में अब सही समय क्षेत्र नहीं होगा (इसलिए आपको समय-सीमा को अनदेखा करना होगा)। अगर मुझे कुछ और चाहिए, तो मैं क्षण भर में उपयोग करता हूं।

var d = new Date();    
d = new Date(d.getTime() - d.getTimezoneOffset() * 60000)
var yyyymmdd = t.toISOString().slice(0,0); 
// 2017-05-09T08:24:26.581Z (but this is not UTC)

D.getTimezoneOffset () मिनटों में समय क्षेत्र ऑफ़सेट लौटाता है, और d.getTime () एमएस में है, इसलिए x 60,000।


1
@VG मैंने 60k से कहाँ आता है के बारे में कुछ और जानकारी जोड़ी है। उममीद है कि इससे मदद मिलेगी।
जेरेमी चोन

5

यहाँ मैं पिछले परियोजनाओं में इस्तेमाल किया है:

var myDate = new Date();
var tzo = (myDate.getTimezoneOffset()/60)*(-1);
//get server date value here, the parseInvariant is from MS Ajax, you would need to do something similar on your own
myDate = new Date.parseInvariant('<%=DataCurrentDate%>', 'yyyyMMdd hh:mm:ss');
myDate.setHours(myDate.getHours() + tzo);
//here you would have to get a handle to your span / div to set.  again, I'm using MS Ajax's $get
var dateSpn = $get('dataDate');
dateSpn.innerHTML = myDate.localeFormat('F');

4
यह ASP.NET- विशिष्ट सामान के साथ है।
जिग्गीमॉन्थ

टाइमज़ोन ऑफ़सेट्स आवश्यक रूप से एक घंटे के भी गुणक नहीं हैं, इसलिए getTimezoneOffset()/60अक्सर एक दशमलव मान वापस आ जाएगा। यह 1900 से पहले की तारीखों के लिए विशेष रूप से सच है, जहां कई स्थानों पर मिनट और सेकंड में ऑफसेट थे। इसके अलावा, जावास्क्रिप्ट तिथियों को अब ऐतिहासिक ऑफसेट का समर्थन करने की आवश्यकता है। जैसे 1890 में मास्को में ऑफसेट +2: 30: 17 था। देखें ब्राउज़र्स, समय क्षेत्र, क्रोम 67 त्रुटि
RobG

3

.getTimezoneOffset()विधि समय क्षेत्र GMT / UTC समयज़ोन से मिनट, गिनती "पश्चिम" में ऑफसेट रिपोर्ट करती है, एक ऑफसेट मूल्य एक आम तौर पर करने के लिए अभ्यस्त है क्या करने के लिए नकारात्मक है कि हो जाती है। (उदाहरण, न्यूयॉर्क का समय +240 मिनट या +4 घंटे बताया जाएगा)

घंटों में सामान्य समय-क्षेत्र ऑफ़सेट प्राप्त करने के लिए, आपको उपयोग करने की आवश्यकता है:

var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60

महत्वपूर्ण विवरण:
ध्यान दें कि दिन के समय की बचत का समय परिणाम में निहित होता है - इसलिए यह विधि आपको वास्तव में समय ऑफसेट देती है - वास्तविक भौगोलिक समय-क्षेत्र ऑफसेट नहीं।


3

PHP कोड से तारीख के साथ मैं कुछ इस तरह का इस्तेमाल किया ..

function getLocalDate(php_date) {
  var dt = new Date(php_date);
  var minutes = dt.getTimezoneOffset();
  dt = new Date(dt.getTime() + minutes*60000);
  return dt;
}

हम इसे इस तरह कह सकते हैं

var localdateObj = getLocalDate('2015-09-25T02:57:46');

सवाल जावास्क्रिप्ट के बारे में था, पीएचपी के बारे में नहीं।
पाइपड्रीमबॉम्ब

5
उत्तर केवल जावास्क्रिप्ट में है, यह प्रश्न में उल्लिखित है कि सर्वर की तारीख UTC में है। इसलिए सर्वर किसी भी भाषा में हो सकता है। इसलिए मैंने केवल PHP के लिए उत्तर दिया
hriziya

3

मैं अब तक के उत्तरों को मिलाता हूं और इसे जोड़ता हूं, क्योंकि मुझे उन सभी को पढ़ना था और उपयोगकर्ता के स्थानीय समयक्षेत्र प्रारूप में db से दिनांक समय स्ट्रिंग प्रदर्शित करने के लिए कुछ समय के लिए अतिरिक्त जांच करना था।

डेटाइम स्ट्रिंग एक अजगर से आता है / प्रारूप में django db: 2016-12-05T15: 12: 12.2.2ZZ

जावास्क्रिप्ट में ब्राउज़र भाषा का विश्वसनीय पता लगाना सभी ब्राउज़रों में काम नहीं करता है ( ब्राउज़र भाषा की प्राथमिकता का पता लगाने के लिए जावास्क्रिप्ट देखें) ), इसलिए मुझे सर्वर से ब्राउज़र की भाषा मिलती है।

पायथन / Django: संदर्भ पैरामीटर के रूप में अनुरोध ब्राउज़र भाषा भेजें:

language = request.META.get('HTTP_ACCEPT_LANGUAGE')
return render(request, 'cssexy/index.html', { "language": language })

HTML: इसे एक छिपे हुए इनपुट में लिखें:

<input type="hidden" id="browserlanguage" value={{ language }}/>

जावास्क्रिप्ट: छिपे हुए इनपुट का मान प्राप्त करें, जैसे एन-जीबी, एन-यूएस; क्यू = 0.8, एन; क्यू = 0.6 / और फिर सूची में पहली भाषा को केवल प्रतिस्थापित और नियमित अभिव्यक्ति के माध्यम से लें।

const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "$1");

जावास्क्रिप्ट: डेटाटाइम में कनवर्ट करें और इसे प्रारूपित करें:

var options = { hour: "2-digit", minute: "2-digit" };
var dt = (new Date(str)).toLocaleDateString(defaultlang, options);

देखें: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

परिणाम है (ब्राउज़र भाषा एन-जीबी है): 05/12/2016, 14:58


3

// new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]])
var serverDate = new Date(2018, 5, 30, 19, 13, 15); // just any date that comes from server
var serverDateStr = serverDate.toLocaleString("en-US", {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
})
var userDate = new Date(serverDateStr + " UTC");
var locale = window.navigator.userLanguage || window.navigator.language;

var clientDateStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric'
});

var clientDateTimeStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
});

console.log("Server UTC date: " + serverDateStr);
console.log("User's local date: " + clientDateStr);
console.log("User's local date&time: " + clientDateTimeStr);


संदर्भ के लिए: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… (मुझे optionsमेरे मामले के लिए भाग की आवश्यकता है )
क्नोस

2

मेरे पास जो सबसे अच्छा समाधान आया है वह है [टाइम डिस्प्ले = "llll" डेटाइम = "UTC टाइम" /] टैग बनाना, और उपयोगकर्ता के समय के सापेक्ष पार्स करने के लिए जावास्क्रिप्ट (jquery) का उपयोग करना।

http://momentjs.com/ Moment.js

अच्छी तरह से समय प्रदर्शित करेगा।


2

आप निम्नलिखित का उपयोग कर सकते हैं, जो जीएमटी से टाइमज़ोन ऑफसेट को मिनटों में रिपोर्ट करता है:

new Date().getTimezoneOffset();

नोट: - यह फ़ंक्शन एक ऋणात्मक संख्या लौटाता है।


1

getTimeZoneOffset () और toLocaleString बेसिक डेट वर्क के लिए अच्छे हैं, लेकिन अगर आपको रियल टाइमज़ोन सपोर्ट की ज़रूरत है, तो mde के टाइमज़ोन .js को देखें ।

इस प्रश्न के उत्तर में कुछ और विकल्पों पर चर्चा की गई है


1

दिनांक को स्थानीय दिनांक में परिवर्तित करने के लिए toLocaleDateString () विधि का उपयोग करें।

var date = (new Date(str)).toLocaleDateString(defaultlang, options);

स्थानीय समय का उपयोग करने के लिए समय बदलने के लिए toLocaleTimeString () विधि का उपयोग करें।

var time = (new Date(str)).toLocaleTimeString(defaultlang, options);

-12

पता नहीं कैसे करना है, लेकिन जावास्क्रिप्ट क्लाइंट साइड टेक्नोलॉजी है।

usersLocalTime = new Date();

इसमें क्लाइंट का समय और तारीख होगी (जैसा कि उनके ब्राउज़र द्वारा रिपोर्ट किया गया है, और वे जिस कंप्यूटर पर बैठे हैं, उसे बढ़ाकर)। प्रतिक्रिया में सर्वर के समय को शामिल करने और अनुमान लगाने के लिए कुछ सरल गणित करने के लिए यह तुच्छ होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.