कन्वर्ट UTC युग को स्थानीय तिथि


273

मैं अब इसके लिए थोड़ा संघर्ष कर रहा हूं। मैं युग को एक तिथि वस्तु में बदलने की कोशिश कर रहा हूं। यूटीसी में मुझे युग भेजा गया है। जब भी आप new Date()एक युग पास करते हैं, तो यह मान लेता है कि यह स्थानीय युग है। मैंने एक यूटीसी ऑब्जेक्ट बनाने की कोशिश की, फिर setTime()उसे उचित युग में समायोजित करने के लिए उपयोग किया, लेकिन एकमात्र तरीका जो उपयोगी लगता है toUTCString()और तार मुझे मदद करते हैं। अगर मैं उस स्ट्रिंग को एक नई तारीख में पास करता हूं, तो यह ध्यान देना चाहिए कि यह यूटीसी है, लेकिन ऐसा नहीं है।

new Date( new Date().toUTCString() ).toLocaleString()

मेरा अगला प्रयास स्थानीय वर्तमान युग और यूटीसी वर्तमान युग के बीच के अंतर को पाने की कोशिश करना था, लेकिन मैं ऐसा नहीं कर पाया।

new Date( new Date().toUTCString() ).getTime() - new Date().getTime()

यह केवल मुझे बहुत छोटे अंतर दे रहा है, 1000 के तहत, जो कि मिलीसेकंड में है।

कोई सुझाव?


11
यूटीसी में 1970 की तारीख के बाद के समय को युगपत मिसे के रूप में परिभाषित किया गया है । स्थानीय युग जैसी कोई चीज नहीं है! यकीन नहीं होता कि मैं आपकी समस्या समझ रहा हूँ।
चेतन शास्त्री

हो सकता है कि कंप्यूटर पर टाइमज़ोन गलत हो, जिससे UTC मान अलग हो जाए?
किजिन k

2
आपको अपनी घड़ी को यूटीसी समय पर सेट करना होगा, यदि आप एलोकैलेस्ट्रिंग () का उपयोग करते समय यूटीसी समय देखना चाहते हैं। मध्यरात्रि यूटीसी 7pm ईएसटी है। यदि आप नई तारीख () का उपयोग करते हैं। तो लोकेलस्ट्रीमिंग के बजाय () आप कुछ इस तरह से प्राप्त करेंगे: 'शुक्र जनवरी 07 2011 07:00:00 GMT-0500', जिसमें ऑफसेट शामिल है।
kennebec

जवाबों:


463

मुझे लगता है कि मेरे पास एक सरल समाधान है - प्रारंभिक तिथि को युग के लिए सेट करें और यूटीसी इकाइयां जोड़ें। मान लें कि आपके पास एक UTC युगांतर सेकंड में संग्रहीत है। कैसे के बारे में 1234567890। स्थानीय समय क्षेत्र में इसे उचित तिथि में परिवर्तित करने के लिए:

var utcSeconds = 1234567890;
var d = new Date(0); // The 0 there is the key, which sets the date to the epoch
d.setUTCSeconds(utcSeconds);

d अब (मेरे समय क्षेत्र में) एक तिथि निर्धारित की गई है Fri Feb 13 2009 18:31:30 GMT-0500 (EST)


189
FWIW, दिनांक वस्तुओं को मिलीसेकंड के साथ आरंभ किया जा सकता है। तो, var d = new Date(utcSeconds * 1000)एक ही परिणाम प्राप्त करना चाहिए।
१६

54
var d = new Date(1234567890000)एक ही परिणाम देता है
मटकाज़ लिपस

11
सोचा कि शायद कुछ लोग कुछ बिंदुओं से स्पष्टता प्राप्त कर सकते हैं: दिनांक वस्तु समय-सीमा के साथ निर्धारित नहीं होती है "उसमें मुहर लगी"। इसे एक संख्या के अलावा और कुछ नहीं समझें। यह संख्या 1970 जून 1 UTC से अब (अब UTC में भी है) के बाद मिलीसेकंड की संख्या है। इसलिए, जब भी आप कोई दिनांक ऑब्जेक्ट बनाते हैं, तो यह वास्तव में पर्दे के पीछे UTC में होता है। 2. उस तारीख को प्रदर्शित करने के लिए, आप इसे लोकल सेटिंग (toLocaleString) (), या, UTC (toUTCString ()) के रूप में प्रदर्शित कर सकते हैं। आपको कुछ भी बदलने की आवश्यकता नहीं है। utc millisec, सभी अच्छे के साथ निर्माण करें। स्ट्रिंग - इतने लंबे समय तक यह स्थानीय समय क्षेत्र में है।
दा बिच

2
1234567890000 को 1234567890, उर्फ ​​Y39K समस्या के समान माना जाता है ...
मटनअप

1
@ मटटनअप, 1000 मल्टिपलिकेशन के साथ इसने काम किया। लेकिन, 'Y39K प्रॉब्लम' Google कोई भी वैध परिणाम नहीं दे रहा है। कोई भी URL मददगार होगा
P Satish Patro

237

यह आसान है, new Date()बस मिलीसेकंड लेता है, जैसे

new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)

6
अच्छा है! इसे वास्तव में स्वीकृत उत्तर माना जाना चाहिए।
निजार बी।

यह मेरे लिए काम नहीं करता था, यह तब काम करता है जब आपके पास टाइमस्टैम्प होता है, लेकिन utc epoch के साथ आपको मैन्युअल रूप से utcseconds सेट करना होता है, स्वीकार करने का उत्तर सही उत्तर है
sameerali

12
यह एक उचित उत्तर है। नई तारीख मिलिसेकंड ले सकती है, इसलिए केवल 1000 से गुणा करें const d = new Date(epoch * 1000):।
विनील

@sameerali शायद आपके सिस्टम में कुछ अलग समस्या थी या आप भ्रमित हो गए। यह उत्तर सही उत्तर है। यूनिक्स युग की परिभाषा: 1 जनवरी मध्यरात्रि यूटीसी के बाद से सेकंड की संख्या समाप्त हो गई । बीते मिलीसेकंड की संख्या प्राप्त करने के लिए बस 1000 से गुणा करें।
nalply

32

और सिर्फ लॉग के लिए, मैंने मोमेंट.जेएस लाइब्रेरी का उपयोग करके ऐसा किया , जिसका उपयोग मैं वैसे भी प्रारूपण के लिए कर रहा था।

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)

1
पल अच्छा है, लेकिन सिर्फ एक युग को तिथि में बदलने के लिए 1.3 एमबी लाइब्रेरी का उपयोग करना पागलपन है। कोई आश्चर्य नहीं कि वहाँ बहुत सारे फूला हुआ नोड अनुप्रयोग हैं।
Not2qubit

20

युग 1 जनवरी, 1970 से सेकंड में है । 1 जनवरी, 1970 से मिलीसेकंडdate.getTime() रिटर्न । इसलिए, यदि आपके पास एक एपोक टाइमस्टैम्प है, तो इसे 1000 तक गुणा करके एक जावास्क्रिप्ट टाइमस्टैम्प में परिवर्तित करें।

   function epochToJsDate(ts){
        // ts = epoch timestamp
        // returns date obj
        return new Date(ts*1000);
   }

   function jsDateToEpoch(d){
        // d = javascript date obj
        // returns epoch timestamp
        return (d.getTime()-d.getMilliseconds())/1000;
   }

सोच रहा था कि पृथ्वी पर क्या था। यह जानकर बहुत अच्छा लगा कि जब यह तिथि निर्धारण की बात आती है तो ! धन्यवाद!
ग्रेफॉक्स

16
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}

1
आपने मेरा दिन बना दिया। स्व। मैंने बस अपनी नौकरी के लिए ऋण चिह्न को प्लस चिह्न से बदल दिया।
लुडोविक क्रूट

5

वर्तमान युग में [ms] समय को २४ घंटे में बदलने के लिए। आपको 12-घंटे के प्रारूप को अक्षम करने के विकल्प को निर्दिष्ट करने की आवश्यकता हो सकती है ।

$ node.exe -e "var date = new Date(Date.now()); console.log(date.toLocaleString('en-GB', { hour12:false } ));"

2/7/2018, 19:35:24

या जेएस के रूप में:

var date = new Date(Date.now()); 
console.log(date.toLocaleString('en-GB', { hour12:false } ));
// 2/7/2018, 19:35:24

console.log(date.toLocaleString('en-GB', { hour:'numeric', minute:'numeric', second:'numeric', hour12:false } ));
// 19:35:24

ध्यान दें: के उपयोग के en-GBयहाँ, बस एक (यादृच्छिक) 24 घंटे के प्रारूप का उपयोग कर एक जगह का चुनाव है, यह आपके समय क्षेत्र नहीं है!


1
दिनांक विधि से किसी भी प्रकार का रूपांतरण प्राप्त करने का यह सबसे अच्छा तरीका है। धन्यवाद!
SeaWarrior404

केवल एक चीज जो मुझे उपरोक्त के साथ पसंद नहीं है, वह यह है कि यह उस अस्पष्ट प्रारूप में तारीख लौटाता है d/m/yyyyया यह है m/d/yyyy? इसे प्रदर्शित करने का सही (सबसे तार्किक) तरीका होना चाहिए yyyy-mm-dd:। कोई लेने वाला?
not2qubit

4

युग समय (यानी यूनिक्स युग समय) लगभग हमेशा सेकंड की संख्या है जो 1 जनवरी 1970 00:00:00 (UTC समय) के बाद समाप्त हो गई है, मिलीसेकंड की संख्या नहीं जो यहां के कुछ उत्तर निहित हैं।

https://en.wikipedia.org/wiki/Unix_time

इसलिए, यदि आपको एक यूनिक्स एपोच समय मूल्य दिया गया है, तो यह संभवत: कुछ सेकंड में होगा, और कुछ ऐसा दिखाई देगा 1547035195। यदि आप जावास्क्रिप्ट में इस मानव को पठनीय बनाना चाहते हैं, तो आपको मूल्य को मिलीसेकंड में बदलने की जरूरत है, और उस मान को Date(value)कंस्ट्रक्टर में पास करें, जैसे:

const unixEpochTimeMS = 1547035195 * 1000;
const d = new Date(unixEpochTimeMS);
// Careful, the string output here can vary by implementation...
const strDate = d.toLocaleString();

आपको d.setUTCMilliseconds(0)स्वीकृत उत्तर में चरण करने की आवश्यकता नहीं है क्योंकि जावास्क्रिप्ट Date(value)निर्माता UTC लेता है मिलिसेकंड (एक स्थानीय समय नहीं) में मूल्य ।

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax

यह भी ध्यान दें कि आपको Date(...)एक स्ट्रिंग डेटाइम प्रतिनिधित्व लेने वाले कंस्ट्रक्टर के उपयोग से बचना चाहिए , यह अनुशंसित नहीं है (ऊपर लिंक देखें)।


3

क्या आप यूटीसी स्ट्रिंग को "स्थानीय" स्ट्रिंग में बदलने के लिए कह रहे हैं? तुम यह कर सकते थे:

var utc_string = '2011-09-05 20:05:15';
var local_string = (function(dtstr) {
    var t0 = new Date(dtstr);
    var t1 = Date.parse(t0.toUTCString().replace('GMT', ''));
    var t2 = (2 * t0) - t1;
    return new Date(t2).toString();
})(utc_string);

3

@Djechlin द्वारा उपरोक्त उत्तर के अलावा

d = '1394104654000';
new Date(parseInt(d));

धर्मान्तरित समय मानव पठनीय तिथि करने के लिए। बस उस प्रकार को मत भूलना © एक समय में एक एंगर होना चाहिए।


3

इसका सबसे सरल उपाय है, जो है:

var timestamp = Date.now(), // returns milliseconds since epoch time
    normalisedTime = new Date(timestamp);

ध्यान दें कि यह कथन * 1000के अंत में नहीं new Date(timestamp)है क्योंकि यह (वैसे भी मेरे लिए!) हमेशा गलत तारीख देने के लिए लगता है, अर्थात वर्ष 2019 को देने के बजाय यह वर्ष 51015 के रूप में वर्ष देता है, इसलिए इसे ध्यान में रखें।


2

यदि आप समय-समय पर पुस्तकालयों के बिना UTC और स्थानीय समय से समय और दिनांक रूपांतरणों को हल करना पसंद करते हैं, तो नीचे दिए गए विकल्प पर एक नज़र डालें।

यूटीसी टाइमस्टैम्प का उपयोग करने वाले अनुप्रयोगों के लिए, आपको लागू होने पर स्थानीय समय-क्षेत्र और दिन के उजाले की बचत को देखते हुए ब्राउज़र में तारीख दिखाने की आवश्यकता हो सकती है। एक ऐसी तारीख का संपादन करना जो एक अलग दिन के बचत समय में हो, भले ही एक ही समयक्षेत्र में मुश्किल हो।

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

मैं आपको इस समाधान का परीक्षण करने के लिए नीचे दिए गए कोड स्निपेट की जांच करने की सलाह देता हूं।

मिलीसेकंड से बातचीत

Number.prototype.toLocalDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() + (value.getTimezoneOffset() / 60));

    return value;
};

Number.prototype.toUTCDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));

    return value;
};

तारीखों से बातचीत

Date.prototype.getUTCTime = function () {
    return this.getTime() - (this.getTimezoneOffset() * 60000);
};

प्रयोग

// Adds the timezone and daylight savings if applicable
(1499670000000).toLocalDate();

// Eliminates the timezone and daylight savings if applicable
new Date(2017, 6, 10).getUTCTime();

इसे अपने लिए देखें


यह वास्तविक उत्तर है। मेरे लिए एक जादू की तरह काम किया। नई तिथि (0) सेट करना और मिलीसेकंड जोड़ना नई तिथि (मिलीसेकंड) के समान है
जर्सी_गाय

1

संपादित करें

var utcDate = new Date(incomingUTCepoch);
var date = new Date();
date.setUTCDate(utcDate.getDate());
date.setUTCHours(utcDate.getHours());
date.setUTCMonth(utcDate.getMonth());
date.setUTCMinutes(utcDate.getMinutes());
date.setUTCSeconds(utcDate.getSeconds());
date.setUTCMilliseconds(utcDate.getMilliseconds());

EDIT तय किया


मैं अपने दूसरे उदाहरण में इसके माध्यम से गया। यह अंतर मुझे 50 और 900 के बीच कहीं भी देता है, जो कि
मील के पत्थरों

उनमें से कोई भी मेरी मदद नहीं करता है। उन्हें एक सेट-टाइम विधि याद आ रही है, जो एकदम सही होगी: P w3schools.com/jsref/jsref_obj_date.asp
शेन रीस्टल

कम से कम Ubuntu के लिए फ़ायरफ़ॉक्स पर काम नहीं करता है। दिनांक निर्धारित करने के बाद कोड को दिन / महीना / वर्ष निर्धारित नहीं करना चाहिए।
साइमन कोज़लोव

@ शिमोन कोज़लोव वास्तव में डेट ऑब्जेक्ट में गलत धारणा, सेटडेट और गेटडेट को महीने में दिन का संदर्भ देते हैं, और समस्या यह है कि मैंने ऐसे कार्यों का उपयोग किया (सेटआउट) जो मौजूद नहीं है, आश्चर्यचकित हो गया स्वीकार किया गया !!
अमजद मास

@AmjadMasad आपका उत्तर अधिक उपयोगी होगा यदि आप अपेक्षित आउटपुट भी दिखाते हैं।
Not2qubit

0

ध्यान में रखते हुए, आपके पास epoch_timeउपलब्ध है,

// for eg. epoch_time = 1487086694.213
var date = new Date(epoch_time * 1000); // multiply by 1000 for milliseconds
var date_string = date.toLocaleString('en-GB');  // 24 hour format


0

@ अमजद, अच्छा विचार है, लेकिन एक बेहतर कार्यान्वयन होगा:

Date.prototype.setUTCTime = function(UTCTimestamp) {
    var UTCDate = new Date(UTCTimestamp);
    this.setUTCFullYear(UTCDate.getFullYear(), UTCDate.getMonth(), UTCDate.getDate());
    this.setUTCHours(UTCDate.getHours(), UTCDate.getMinutes(), UTCDate.getSeconds(), UTCDate.getMilliseconds());
    return this.getTime();
}

-1

पहले इसे स्ट्रिंग में परिवर्तित करें और फिर टाइमज़ोन पाठ को बदलें।

function convertUnixTime(time) {
  return new Date(time*1000).toString().replace("GMT+0530 (Sri Lanka Standard Time)","");
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.