क्षण.जैसे वस्तु का रूपांतरण


696

Moment.js का उपयोग करके मैं टाइमज़ोन के साथ एक सही क्षण ऑब्जेक्ट को ऑब्जेक्ट में नहीं बदल सकता। मुझे सही तारीख नहीं मिल सकती है।

उदाहरण:

var oldDate = new Date(),
    momentObj = moment(oldDate).tz("MST7MDT"),
    newDate = momentObj.toDate();
console.log("start date " + oldDate)
console.log("Format from moment with offset " + momentObj.format())
console.log("Format from moment without offset " + momentObj.utc().format())
console.log("(Date object) Time with offset " + newDate)
console.log("(Date object) Time without offset "+ moment.utc(newDate).toDate())

1
आप किस आउटपुट की उम्मीद करते हैं और आपको क्या आउटपुट मिलता है?
फेलिक्स क्लिंग

4
4 पंक्ति में मुझे इतना आउटपुट मिलता है: <code> (दिनांक ऑब्जेक्ट) ऑफसेट थू अगस्त 01 2013 15:23:49 GMT + 0300 (00инляндия (лето)) के साथ समय </ code> लेकिन timezone MSTHMDT होना चाहिए
vadim.zhiltsov

Wednesday 24th 2019, 12:47:48 amक्या इस में बदलना संभव है 2019-04-23T19:17:48.000Z ? @ vadim.zhiltsov
अनुपम मौर्य

दिनांक ऑब्जेक्ट्स में टाइमज़ोन नहीं है, वे केवल 1970-01-01T00: 00: 00Z से ऑफ़सेट हैं। इसलिए जब आप टॉडेट को कॉल करते हैं , तो लौटी हुई वस्तु ने समय-वस्तु की जानकारी खो दी है जिसे आप उस पल ऑब्जेक्ट के साथ संलग्न करते हैं .tz("MST7MDT")। यही कारण है कि मोमेंट.ज़ जैसी लाइब्रेरियाँ मौजूद हैं, बिल्ट-इन डेट की नंगे हड्डियों की क्षमता को पूरा करने के लिए, जो केवल यूटीसी और होस्ट टाइमज़ोन को समझती है, बस।
रॉब

जवाबों:


1236

किसी क्षण ऑब्जेक्ट को दिनांक ऑब्जेक्ट में बदलने के लिए इसका उपयोग करें:

से http://momentjs.com/docs/#/displaying/as-javascript-date/

moment().toDate();

पैदावार:

Tue Nov 04 2014 14:04:01 GMT-0600 (CST)

11
@ स्पेंसर - हां, यह शीर्षक का उत्तर देता है, और toDateवास्तव में ए से Dateवस्तु प्राप्त करने का तरीका है moment। लेकिन सवाल के शरीर में कोड समय क्षेत्र रूपांतरण के बारे में पूछता है - जो Dateनहीं कर सकता। जब तक माउंटेन का समय वास्तव में उपयोगकर्ता का समय क्षेत्र नहीं है, तब तक मुझे यकीन नहीं है कि इस प्रश्न का उत्तर कैसे दिया जाएगा।
मैट जॉनसन-पिंट

1
@ मैट यह सिर्फ इस बात पर निर्भर करता है कि आप किस प्रश्न को देख रहे हैं। अधिकांश लोग Google को खोजते हैं और देखते हैं कि यह शीर्षक उनके प्रश्न के साथ है और उत्तर को उत्तोलित करता है जो शीर्षक का उत्तर देता है, प्रश्न का शरीर नहीं। यह व्याख्या कर सकता है कि क्यों यह सबसे ऊपर है, भले ही यह तकनीकी रूप से ओपी की मदद नहीं करता है।
स्पेंसर

14
क्या यह वास्तव में सही उत्तर है? सवाल यह था कि कैसे पल वस्तु को एक जावास्क्रिप्ट तिथि में परिवर्तित किया जाए लेकिन TIMEZONE के साथ। यह अभी भी स्थानीय समय क्षेत्र में वापस आता है जब जावास्क्रिप्ट तिथि ऑब्जेक्ट में बदल जाता है।
अकथ्य

1
हे लोग इस लिंक को देखें क्षणभंगुरCom /guides/#/warnings/js-date । यह हतोत्साहित किया जाता है और आगामी प्रमुख रिलीज में हटा दिया जाएगा।
gtzinos 13

3
@gtzinos जो आप लिंक कर रहे हैं और संदर्भित कर रहे हैं, वह एक अलग मुद्दा और परिदृश्य है, उदाहरण के लिए एक पल निर्माणकर्ता में एक स्ट्रिंग गुजरना moment("12/12/2011")है जहां आपको वह संदेश मिलेगा। यह कुछ भी नहीं करने के लिए समय के साथ कुछ नहीं करना है objmoment().toDate()
btbJosh

51

जब तक आप अपने इच्छित क्षेत्रों के लिए डेटा के साथ क्षण-समय-सारणी को इनिशियलाइज़ कर लेते हैं , आपका कोड अपेक्षित रूप से काम करता है।

आप उस समय क्षेत्र को सही ढंग से परिवर्तित कर रहे हैं, जो आउटपुट की दूसरी पंक्ति में परिलक्षित होता है momentObj.format()

UTC पर स्विच करना केवल ऑफ़सेट को नहीं छोड़ता है, यह वापस UTC समय क्षेत्र में बदल जाता है। यदि आप ऐसा करने जा रहे हैं, तो आपको मूल .tz()कॉल की आवश्यकता नहीं है । आप बस कर सकते हैं moment.utc()

शायद आप आउटपुट आउटपुट स्ट्रिंग को बदलने की कोशिश कर रहे हैं? यदि हां, तो आप जिस formatविधि को चाहते हैं, उसे निर्दिष्ट करें :

momentObj.format("YYYY-MM-DD HH:mm:ss")

अपने कोड की अंतिम पंक्तियों के बारे में - जब आप किसी Dateऑब्जेक्ट का उपयोग करके वापस toDate()जाते हैं, तो आप क्षण का व्यवहार छोड़ रहे हैं। js और जावास्क्रिप्ट के व्यवहार पर वापस जा रहे हैं। एक जावास्क्रिप्ट Dateऑब्जेक्ट हमेशा उस कंप्यूटर के स्थानीय समय क्षेत्र में मुद्रित किया जाएगा, जिस पर वह चल रहा है। वहाँ कुछ भी नहीं है ।js उस के बारे में क्या कर सकते हैं।

अन्य छोटी चीजों की एक जोड़ी:

  • जबकि पल कंस्ट्रक्टर ए ले सकता है Date, यह आमतौर पर एक का उपयोग नहीं करने के लिए सबसे अच्छा है। "अभी" के लिए, उपयोग न करें moment(new Date())। इसके बजाय, बस उपयोग करें moment()। दोनों काम करेंगे लेकिन यह अनावश्यक रूप से बेमानी है। यदि आप एक स्ट्रिंग से पार्स कर रहे हैं, तो उस स्ट्रिंग को सीधे क्षण में पास करें। इसे Dateपहले पार्स करने की कोशिश मत करो । आप पल के पार्सर को और अधिक विश्वसनीय पाएंगे।

  • समय क्षेत्र जैसे MST7MDTबैकवर्ड संगतता कारणों से हैं। वे POSIX स्टाइल टाइम ज़ोन से स्टेम करते हैं, और उनमें से केवल कुछ ही TZDB डेटा में हैं। जब तक बिल्कुल आवश्यक न हो, आपको एक कुंजी का उपयोग करना चाहिए जैसे कि America/Denver


धन्यवाद मैट! आपका उत्तर उपयोगी था। जैसा कि आपने MST7MDT के बजाय अमेरिका / डेनवर का उपयोग करने के बारे में उल्लेख किया है, क्या इन मैपिंग के लिए कोई मानचित्र उपलब्ध है? मैं CET, EET, EST5EDT, CST6CDT, PST8PDT जैसे कुछ ऐसे टाइमज़ोन का उपयोग कर रहा हूं।
मोनिषी 14

क्या यह संभव है उदाहरण के लिए: "10:20 AM" (क्षण से स्ट्रिंग समय प्राप्त) ()। प्रारूप ('hh: mm A')) दिनांक वस्तु के लिए ??
रैम

2
@ram - 1) यदि आपके पास एक पल है, तो उपयोग करें .toDate()। 2) नए प्रश्न पूछने के लिए टिप्पणियों का उपयोग न करें। यही कारण है कि बड़ा "प्रश्न पूछें" बटन है।
मैट जॉनसन-पिंट

22

.toDate वास्तव में मेरे लिए काम नहीं किया, इसलिए, यहाँ मैंने वही किया है:

futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM"))

उम्मीद है की यह मदद करेगा


2
यह उत्तर प्रश्न का उत्तर नहीं देता है। कोड लिखने का एक लंबा घुमावदार तरीका है moment().add(1, 'd').toDate()
9

12

चूंकि javascript दिनांक ऑब्जेक्ट पर क्षणिका का कोई नियंत्रण नहीं है इसलिए मुझे इसके चारों ओर एक काम मिला।

const currentTime = new Date();    
const convertTime = moment(currentTime).tz(timezone).format("YYYY-MM-DD HH:mm:ss");
const convertTimeObject = new Date(convertTime);

यह आपको परिवर्तित समय के साथ एक जावास्क्रिप्ट तिथि वस्तु देगा


2
यह एकमात्र सही उत्तर है जो सीधे प्रश्न का उत्तर देता है।
अनीश सना

1
जैसा मुझे चाहिए था यह बिल्कुल वैसा ही है। मैं देशी तिथियों की अपेक्षा कर रहा था कि समय क्षेत्र का सही ढंग से प्रतिनिधित्व किया जाए, लेकिन मैं दुखी था।
mklbtz

1
"YYYY-MM-DD HH: mm: ss" प्रारूप सफारी द्वारा समर्थित नहीं है, इसलिए परिणाम शून्य है । प्रारूप "YYYY-MM-DDTHH: mm: ss" होना चाहिए (एक ECMAScript समर्थित प्रारूप, दिनांक और समय भागों के बीच एक "T" का उपयोग करें)।
RobG

4

मुझे अपनी डेट स्ट्रिंग में टाइमजोन की जानकारी होनी चाहिए। मैं मूल रूप से उपयोग कर रहा था, moment.tz(dateStr, 'America/New_York').toString();लेकिन फिर मुझे उस स्ट्रिंग को पल में खिलाने के बारे में त्रुटियां होने लगीं।

मैंने कोशिश की, moment.tz(dateStr, 'America/New_York').toDate();लेकिन तब मुझे टाइमज़ोन की जानकारी खो गई जिसकी मुझे ज़रूरत थी।

एकमात्र समाधान जिसने समयक्षेत्र के साथ एक प्रयोग करने योग्य दिनांक स्ट्रिंग लौटाया जिसे पल में वापस खिलाया जा सकता थाmoment.tz(dateStr, 'America/New_York').format();


4
let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();

अच्छा और साफ!!!!


यह मेरे मामले में यहाँ एकमात्र समाधान था जिसने utc प्रारूप का काम किया। धन्यवाद
लुइस Febro

3

किसी भी तिथि को बदलने के लिए, उदाहरण के लिए utc:

moment( moment().utc().format( "YYYY-MM-DD HH:mm:ss" )).toDate()

2
यह वास्तव में मेरा दिन बच गया!
एचवी शर्मा

यह उत्तर गलत है। यह टाइमजोन ऑफसेट को दो बार लागू करता है: moment().utc()यूटीसी के लिए मान लौटाता है, फिर .format( "YYYY-MM-DD HH:mm:ss" )एक स्ट्रिंग देता है जो यूटीसी के बिना टाइमजोन ऑफसेट के लिए सेट किया गया है ताकि स्थानीय के रूप में पार्स किया जाए। यह डिफ़ॉल्ट क्षण प्रारूप से मेल नहीं खाता है इसलिए पार्सर में निर्मित द्वारा पार्स किया गया है। यह किसी भी ECMAScript समर्थित प्रारूप से मेल नहीं खाता है, इसलिए पार्सिंग कार्यान्वयन पर निर्भर है। वैसे भी, इसे स्थानीय माना जाता है इसलिए दिनांक का समय मान बनाते समय टाइमज़ोन ऑफसेट को फिर से लागू किया जाता है।
रॉब

3

सवाल थोड़ा अस्पष्ट है। मैं इसे समझाने की पूरी कोशिश करूंगा। पहले आपको यह समझना चाहिए कि समय-समय पर उपयोग कैसे करें । इस उत्तर के अनुसार यहां टाइप करें: क्षण ()। tz कोई फ़ंक्शन नहीं है , आपको डिफ़ॉल्ट क्षण के बजाय क्षण-समय-क्षेत्र से क्षण आयात करना होगा (incourse आपको npm को पहले-समय-स्थापित करना होगा!)। स्पष्टता की खातिर,

const moment=require('moment-timezone')//import from moment-timezone

अब टाइमजोन सुविधा का उपयोग करने के लिए, ..tz ("date_string / क्षण ()", "time_zone") का उपयोग करें ( अधिक जानकारी के लिए https://momentjs.com/timezone/ पर जाएं )। यह फ़ंक्शन किसी विशेष समय क्षेत्र के साथ एक पल की वस्तु लौटाएगा। स्पष्टता की खातिर,

var newYork= moment.tz("2014-06-01 12:00", "America/New_York");/*this code will consider NewYork as the timezone.*/

अब जब आप newYork (पल ऑब्जेक्ट) को क्षण के toDate () (ISO 8601 प्रारूप रूपांतरण) के साथ परिवर्तित करने का प्रयास करते हैं तो आपको ग्रीनविच, यूके का समय मिलेगा। अधिक जानकारी के लिए, इस लेख के माध्यम से https://www.nhc.noaa.gov/aboututc.shtml पर जाएं , UTC के बारे में। हालाँकि यदि आप इस प्रारूप में अपना स्थानीय समय चाहते हैं (न्यूयॉर्क समय, इस उदाहरण के अनुसार), तो बस विधि .utc (ट्रू) को जोड़ें , आर्ग ट्रू के साथ , अपनी पल ऑब्जेक्ट के लिए। स्पष्टता की खातिर,

newYork.toDate()//will give you the Greenwich ,UK, time.

newYork.utc(true).toDate()//will give you the local time. according to the moment.tz method arg we specified above, it is 12:00.you can ofcourse change this by using moment()

संक्षेप में, moment.tz आपके द्वारा निर्दिष्ट समय क्षेत्र पर विचार करता है और आपको परिणाम देने के लिए ग्रीनविच में समय के साथ अपने स्थानीय समय की तुलना करता है। मुझे उम्मीद है कि यह उपयोगी था।


2

पल ने js lib को 06/2018 के अनुसार अपडेट कर दिया है।

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

यदि आपके पास Angular5 + का उपयोग करने की स्वतंत्रता है, तो यहां के टाइमजोन फ़ंक्शन की तुलना में बेहतर डेटपाइप सुविधा का उपयोग करें। मुझे moment.js का उपयोग करना होगा क्योंकि मेरी परियोजना केवल Angular2 तक सीमित है।


1

प्रयास करें (बिना formatचरण के)

new Date(moment())


new Date(moment())के बराबर है new Date()। समयक्षेत्र केवल d के लिए निर्धारित है ।
रॉब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.