moment.js - ইউটিসি ভুল তারিখ দেয়


95

কেন moment.js ইউটিসি সর্বদা ভুল তারিখটি দেখায়। উদাহরণস্বরূপ ক্রোমের বিকাশকারী কনসোল থেকে:

moment(('07-18-2013')).utc().format("YYYY-MM-DD").toString()
// or
moment.utc(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

তারা দু'জনেই "2013-07-17" ফিরে আসবে কেন এটি 18 তম পরিবর্তে 17 তম কেন ফিরে আসছিল ।

তবে আমি যদি ইউটিসি ছাড়াই মুহুর্তগুলি ব্যবহার করি:

moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

আমি "2013-07-18" ফিরে পেয়েছি যা moment.js ইউটিসি ব্যবহার করার সময় আমিও প্রত্যাশা করি।

এর অর্থ কি মুহুর্ত.জস ইউটিসি ব্যবহার করার সময় আমরা সঠিক তারিখটি পেতে পারি না?


4
আমি মনে করি না এর toString()পরে আপনার দরকার format()(এটি ইতিমধ্যে একটি স্ট্রিং দেয়)।
অ্যালেক্স

উত্তর:


161

ডিফল্টরূপে, মোমেন্টজজেএস স্থানীয় সময়ে পার্স করে। যদি কেবল একটি তারিখের স্ট্রিং (সময় না দিয়ে) সরবরাহ করা হয় তবে সময়টি মধ্যরাতে ডিফল্ট হয়।

আপনার কোডে, আপনি একটি স্থানীয় তারিখ তৈরি করেন এবং তারপরে এটি ইউটিসি টাইমজোনতে রূপান্তর করুন (বাস্তবে, এটি মুহূর্তটিকে ইউটিসি মোডে স্যুইচ করে তোলে ), সুতরাং যখন এটি ফর্ম্যাট করা হয়, তখন এটি স্থানান্তরিত হয় (আপনার স্থানীয় সময়ের উপর নির্ভর করে) সামনে বা পিছনে

স্থানীয় সময় অঞ্চলটি যদি ইউটিসি + এন (এন ইতিবাচক সংখ্যা হিসাবে থাকে) এবং আপনি কেবলমাত্র তারিখের একটি স্ট্রিং পার্স করেন তবে আপনি আগের তারিখটি পাবেন।

এটি চিত্রিত করার জন্য এখানে কয়েকটি উদাহরণ দেওয়া হয়েছে (আমার স্থানীয় সময় অফসেটটি ডিএসটি চলাকালীন ইউটিসি + 3):

>>> moment('07-18-2013', 'MM-DD-YYYY').utc().format("YYYY-MM-DD HH:mm")
"2013-07-17 21:00"
>>> moment('07-18-2013 12:00', 'MM-DD-YYYY HH:mm').utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 09:00"
>>> Date()
"Thu Jul 25 2013 14:28:45 GMT+0300 (Jerusalem Daylight Time)"

আপনি যদি ডেট-টাইম স্ট্রিংটি ইউটিসি হিসাবে ব্যাখ্যা করতে চান তবে আপনার এটি সম্পর্কে সুস্পষ্ট হওয়া উচিত:

>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

বা, যেমন ম্যাট জনসন তার উত্তরে উল্লেখ করেছেন, আপনি এটি প্রথমে ইউটিসি তারিখ হিসাবে পার্স করতে পারেন ( এবং সম্ভবত হওয়া উচিত ) moment.utc()অস্পষ্টতা রোধের জন্য দ্বিতীয় যুক্তি হিসাবে ফর্ম্যাট স্ট্রিংটিকে অন্তর্ভুক্ত করে এবং অন্তর্ভুক্ত করতে পারেন।

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

অন্য পথে যেতে এবং কোনও ইউটিসি তারিখকে স্থানীয় তারিখে রূপান্তর করতে, আপনি local()নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন :

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"

অনেক ধন্যবাদ. সুতরাং মূলত, ইউটিসি ব্যবহার করার সময় আমার সর্বদা সময় পাস করা উচিত বা আপনার দ্বিতীয় পদ্ধতির মতো ইউটিসিতে পাস করা উচিত।
brg

হয় বা স্থানীয় টাইমজোন আটকে। আপনি যদি সার্ভার থেকে সময় প্রেরণ করেন তবে আপনি সেগুলি ইউনিক্স টাইমস্ট্যাম্প (এক্স) বা নির্দিষ্ট টাইম জোনে স্ট্রিং হিসাবে প্রকাশ করতে পারেন। কেন যেভাবেই ব্যবহারকারীর স্থানীয় সময় অঞ্চল পরিবর্তে ইউটিসি ব্যবহার করবেন (সার্ভারে সাধারণীকৃত ডেটা প্রেরণের উদ্দেশ্যে ব্যতীত)?
মাস্টারএএম

4
new Date('07-18-2013 UTC')আপনি যদি যত্ন নেন তবে IE8 এ কাজ করবে না সে বিষয়ে সচেতন হন ।
ডিজিট্রি লেজারকা

4
আমি এত দিন ধরে লড়াই করে যাচ্ছি। তাদের সত্যই এটি তাদের সাইটে ভালভাবে ব্যাখ্যা করা উচিত, কারণ আমি ধরে নিই যে এটি moment.js এর সবচেয়ে সাধারণ ব্যবহারের ক্ষেত্রে case তোমাকে অনেক ধন্যবাদ! তুমি সত্যিই আমার ত্বককে বাঁচিয়েছ!
ওয়েবওয়ান্ডার

এই কোডটি আমার পক্ষে কাজ করে: [কোড] মুহুর্ত (স্ট্র্যাটেড, 'ডিডি / এমএম / ওয়াইওয়াই এইচ: মিমি এ')। ইউটিসি (স্ট্র্যাডেট)। ফর্ম্যাট ("ওয়াইওয়াইওয়াই-এমএম-ডিডি এইচ: মিমি") [/ কোড]
ওমর ইসায়েদ

36

উভয়ই Dateএবং momentডিফল্টরূপে ব্রাউজারের স্থানীয় সময় জোনে ইনপুট স্ট্রিংটিকে বিশ্লেষণ করে। তবে Dateএই ক্ষেত্রে কখনও কখনও অসঙ্গতি হয়। স্ট্রিংটি যদি হাইফেনYYYY-MM-DD ব্যবহার করে নির্দিষ্টভাবে হয় বা হয় তবে এটি স্থানীয় সময় হিসাবে এটি ব্যাখ্যা করবে । বিপরীতে , সর্বদা এটি কীভাবে পার্স হয় সে সম্পর্কে সামঞ্জস্য থাকবে।YYYY-MM-DD HH:mm:ssDatemoment

আপনার প্রদত্ত ফর্ম্যাটটিতে ইউটিসি হিসাবে ইনপুট মুহুর্তটি পার্স করার সঠিক উপায়টি হ'ল:

moment.utc('07-18-2013', 'MM-DD-YYYY')

পড়ুন এই ডকুমেন্টেশন

আপনি যদি আউটপুটটির জন্য আলাদাভাবে ফর্ম্যাট করতে চান তবে আপনি এটি করবেন:

moment.utc('07-18-2013', 'MM-DD-YYYY').format('YYYY-MM-DD')

আপনার toStringস্পষ্টভাবে কল করার দরকার নেই ।

নোট করুন যে ইনপুট ফর্ম্যাটটি সরবরাহ করা খুব গুরুত্বপূর্ণ। এটি ছাড়া, 01-04-2013ব্রাউজারের সংস্কৃতি সেটিংসের উপর নির্ভর করে একটি তারিখ 4 শে জানুয়ারী বা এপ্রিল 1 এ হিসাবে প্রক্রিয়াজাত হতে পারে।


কেবল শিখার জন্য, কনসোলে: moment.utc ('2013-07-18 0:00 +0100', 'YYYY-MM-DD HH: মিমি') আমাকে দেয় "2013-07-18 0:00 +0100 " কিন্তু jsfiddle কি dislpays যখন দৌড়ে ভিন্ন যে: বৃহস্পতি জুলাই 25 2013 01:00:00 জিএমটি 0100 নোট 01:00:00 । ধন্যবাদ
brg

momentকনসোলে কাঁচা আউটপুট করা খুব কার্যকর নয়। আপনি সম্ভবত এর অভ্যন্তরীণ বৈশিষ্ট্যগুলির একটির দিকে তাকিয়ে রয়েছেন। ফলাফলগুলি পরীক্ষা করার আগে আপনার এটি ফর্ম্যাট করা উচিত। উদাহরণস্বরূপ moment.utc().format()বা moment().format()
ম্যাট জনসন-পিন্ট

তারিখ এবং মুহূর্ত উভয়ই ডিফল্টরূপে ব্রাউজারের স্থানীয় সময় জোনে ইনপুট স্ট্রিংটিকে বিশ্লেষণ করে। আমি এখনই EDT এ আছি। new Date('2010-12-12')আমাকে Date {Sat Dec 11 2010 19:00:00 GMT-0500 (Eastern Daylight Time)}এফএফ 38.0.5 এ দেয় । "স্থানীয় সময়" এর অর্থ কী, কেবল প্রসঙ্গের সাথে সম্পর্কিতDate - এই ক্ষেত্রে এটির অর্থ মনে হয়, " একটি সময়বিহীন স্ট্রিংটি ইউটিসি-তে থাকবে এবং স্থানীয় সময়কে পার্স করবে" " d.getUTCDate()= 12এবং d.getDate()=11
রাফিন

4
হ্যাঁ, কিছু ব্যতিক্রম আছে। ES5 (সর্বাধিক বর্তমান ব্রাউজারগুলি) হাইফেনের সাথে তারিখগুলি ইউটিসি হিসাবে ব্যাখ্যা করবে, তবে অন্য সমস্ত কিছু স্থানীয় সময় হিসাবে ব্যাখ্যা করা হয়। ES6 স্থানীয় সময়ের মতো একই স্ট্রিংটির ব্যাখ্যা করতে এই আচরণটি পরিবর্তন করছে। আমি উত্তর আপডেট।
ম্যাট জনসন-পিন্ট

হা, হ্যাঁ, এমডিএন-এ ঠিক এই কথাটি বলে চলে গেল ( '2012-12-12'এটি ইউটিসি বি / সি এটি কোনও আইএসও ফর্ম্যাটে, তবে 'December 12, 2012'এমনকি '2012/12/12'ইএস 5 এর স্থানীয় সময় অঞ্চল দিয়েও পার্স করা হয়েছে), তবে আপনি আমাকে এতে মারধর করেছেন। এত দুর্দান্ত যে ES6 তাদের সমস্ত স্থানীয় করে তোলে [তিনি কটাক্ষ করে বলেছেন] তারিখগুলি একটি ব্যথা, (গ)
তারিখের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.