নির্দিষ্ট সময় অঞ্চলে ফর্ম্যাট তারিখ


177

আমি আমার ওয়েব অ্যাপ্লিকেশনে তারিখগুলি পার্স এবং ফর্ম্যাট করতে মোমেন্ট.জেএস ব্যবহার করছি । একটি JSON অবজেক্টের অংশ হিসাবে, আমার ব্যাকএন্ড সার্ভারটি ইউটিসি পর্ব (ইউনিক্স অফসেট) থেকে কয়েক মিলিসেকেন্ড হিসাবে তারিখ প্রেরণ করে।

নির্দিষ্ট সময় অঞ্চলে তারিখগুলি পার্স করা সহজ - পার্সিংয়ের আগে কেবল স্ট্রিংয়ের শেষে আরএফসি 822 টাইমজোন সনাক্তকারী যুক্ত করুন:

// response varies according to your timezone
const m1 = moment('3/11/2012 13:00').utc().format("MM/DD HH:mm")

// problem solved, always "03/11 17:00"
const m2 = moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm")

console.log({ m1, m2 })
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

তবে আমি কীভাবে একটি নির্দিষ্ট টাইমজোনটিতে একটি তারিখ বিন্যাস করব ?

ব্রাউজারের বর্তমান সময় নির্বিশেষে আমি ধারাবাহিক ফলাফল চাই, তবে আমি ইউটিসিতে তারিখগুলি প্রদর্শন করতে চাই না।


2
মুহূর্ত এটি এখনও সমর্থন করে না, তবে তারা এতে কাজ করছে। github.com/timrwood/moment/pull/671
বেন

5
এটি শুধু কাজ করা উচিত। যদি আপনি কোনও মুহুর্তটি কাটিয়ে ওঠেন যাতে কাঙ্ক্ষিত অফসেটটি অন্তর্ভুক্ত থাকে তবে ব্রাউজার-স্থানীয় সময়ের সাথে স্বয়ংক্রিয়ভাবে সামঞ্জস্য না হওয়ার চেয়ে সেই অফসেটটি ধরে রাখা উচিত এবং স্থানীয় সময়টি দেওয়া উচিত। যদি আমি এটি ব্রাউজার-স্থানীয় সময়ের সাথে সামঞ্জস্য করতে চাইতাম, তবে আমি এটি স্পষ্টভাবে ব্যবহারের জন্য অফসেট দেওয়ার পরিবর্তে এটি একটি ইউটিসি সময় দেব। মানে ... আমি এটিকে একটি স্পষ্ট অফসেট দিচ্ছি, কেন এটি মূলত এটি খেয়ে যাচ্ছে এবং ব্রাউজারগুলিতে অফসেটে এটি নিজস্ব রূপান্তর করছে। ভয়াবহ নকশা।
ট্রায়ঙ্কো

@ ট্রাইঙ্কো অফসেটগুলি দিবালোকের সঞ্চয় সাপেক্ষে তাই এটি সর্বদা প্রত্যাশিতভাবে কাজ করে না।
গোলাপী প্যান্থার

1
এর সাথে সম্পর্কিত কিছু, আমি একটি নির্দিষ্ট বিন্যাসে সময় প্রিন্ট করতে চাই, উদাহরণস্বরূপ 15 মার্চ, 2018 তবে এটি করার জন্য বিন্যাসের স্ট্রিংটি খুঁজে পাওয়া যায় না। জেনেরিক DD MMM, YYYYকাজ করে না, যখন আমি এটি পছন্দ করি moment.tz("2018-02-15T14:20:00.000+0530", "Asia/Bangkok").format("DD MMM, YYYY")। কেউ আমাকে ডকুমেন্টেশনে ইঙ্গিত করতে পারে যেখানে আমি এই এপিআই ব্যবহার করার সময় বিন্যাস করার জন্য সমস্ত কীগুলি খুঁজে পেতে পারি।
pRmdk

@ প্রমোদকুমার কি সমস্যা? যে দেয় "15 Feb, 2018"। আপনি কি বিন্যাসের স্ট্রিংটি ব্যবহার DD MMMM, YYYYকরতে চান "15 February, 2018"?
চুপচাপ

উত্তর:


248

হিসাবে নির্দিষ্ট মান্টো এর উত্তর , .utcOffset()মোমেন্ট 2.9.0 হিসাবে পছন্দের পদ্ধতি। এই ফাংশনটি ইউটিসি থেকে আসল অফসেট ব্যবহার করে, বিপরীত অফসেট নয় (যেমন, ডিএসটি চলাকালীন নিউ ইয়র্কের জন্য -240)। "+0400" এর মতো অফসেট স্ট্রিং আগের মতো কাজ করে:

// always "2013-05-23 00:55"
moment(1369266934311).utcOffset(60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).utcOffset('+0100').format('YYYY-MM-DD HH:mm')

পুরোনো .zone()একটি সেটার যেমন ছিল অবচিত Moment.js 2.9.0 হবে। এটি টাইমজোন শনাক্তকারী (যেমন, "-0400" বা "-04: 00" -4 ঘন্টা জন্য) বা ইউটিসির পিছনে মিনিটের প্রতিনিধিত্ব করে এমন একটি স্ট্রিং গ্রহণ করেছে (যেমন, ডিএসটির সময় নিউ ইয়র্কের 240))

// always "2013-05-23 00:55"
moment(1369266934311).zone(-60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).zone('+0100').format('YYYY-MM-DD HH:mm')

সংখ্যক অফসেটের পরিবর্তে নামযুক্ত টাইমজোনগুলির সাথে কাজ করতে, মুহুর্তের সময় অঞ্চল যুক্ত করুন এবং .tz()পরিবর্তে ব্যবহার করুন:

// determines the correct offset for America/Phoenix at the given moment
// always "2013-05-22 16:55"
moment(1369266934311).tz('America/Phoenix').format('YYYY-MM-DD HH:mm')

"টাইপ এরির: অবজেক্ট 240 এর কোনও পদ্ধতিতে 'বিন্যাসে" ত্রুটি নেই এর মাধ্যমে আমি এ নিয়ে সমস্যায় পড়ছিলাম। আমি বুঝতে পেরেছি যে অঞ্চলটি কেবলমাত্র 2.1.0 সংস্করণে এবং মোমেন্ট.জেএস-এর আপ (এবং আমি পুরানো সংস্করণে ছিলাম) হিসাবে একটি সেটার হিসাবে উপলব্ধ। ধন্যবাদ!
মেলিন্ডা ওয়েথারস

5
@ebi এটি ইতিমধ্যে ডিফল্টরূপে ব্রাউজারের সময় অঞ্চল ব্যবহার করে। করার অ্যাক্সেস অফসেট ব্রাউজারের সময় অঞ্চল, ব্যবহার .zone()একটি সংগ্রহকারী, যা ইউটিসি (যেমন, আয় মান সময় নিউ ইয়র্ক 300) থেকে মিনিট ফেরৎ হিসাবে।
নীরবতা

1
@ এরিককোপ নং, বেশ নয় আপনি করতে পারেন ব্যবহার .tz("America/Phoenix")যদি আপনি অন্তর্ভুক্ত momentjs.com/timezone পাশাপাশি অবশ্য। আমি একটি উদাহরণ সহ উত্তর আপডেট করেছি।
নীরবতা

1
মনে রাখবেন যে টাইমজোনটি দিবালোকের সঞ্চয়ের কারণে বিভিন্ন অফসেট থাকলে আশা করে অফসেট ব্যবহার করা চলবে না।
গোলাপী প্যান্থার

1
.UtcOffset () স্বয়ংক্রিয়ভাবে দিবালোক সংরক্ষণের সময় পরিচালনা করবে? আমি যখন শীতকালে ইউটিসি +1 সিইটি সেট করি তখন দিবালোকের সময় সংরক্ষণের সময় এটি ইউটিসি +২ সিইএসটি বাজি রাখবে? কারণ এটি এটিকে ব্যবহারযোগ্য করে তোলে বা না!
হেমসে

61

মুহুর্ত-সময় অঞ্চল ব্যবহার করুন

moment(date).tz('Europe/Berlin').format(format)

কোনও নির্দিষ্ট টাইমজোন অ্যাক্সেস করার আগে আপনাকে এ জাতীয় লোড করতে হবে (বা এখানে বর্ণিত বিকল্প পদ্ধতি ব্যবহার করে )

moment.tz.add('Europe/Berlin|CET CEST CEMT|-10 -20 -30')

প্রশ্নটি যখন জিজ্ঞাসা করা হয়েছিল তখন tz উপলব্ধ ছিল বলে আমি মনে করি না, তবে আমি মনে করি এটি সম্ভবত যাওয়ার উপায়। আমি বর্তমানে মাইএসকিউএল ইউটিসি হিসাবে সঞ্চিত সমস্ত টাইমস্ট্যাম্পগুলির সাথে একটি অবিস্মরণীয় সমস্যা নিয়ে কাজ করছি তবে ব্যবহারকারী কনফিগারেশনের উপর নির্ভর করে নির্দিষ্ট জোনে দেখতে হবে এবং ক্লায়েন্টের টাইমজোন নয়।
নিকডনক

47

বেশ কয়েকটি উত্তর ইতিমধ্যে উল্লেখ করেছে যে মুহুর্তের সময় অঞ্চল হ'ল নামকরণকৃত সময় অঞ্চল নিয়ে যাওয়ার উপায়। আমি এই গ্রন্থাগারটি সম্পর্কে কিছু স্পষ্ট করতে চাই যা আমার কাছে বেশ বিভ্রান্তিকর ছিল। এই দুটি বিবৃতি মধ্যে পার্থক্য আছে:

moment.tz(date, format, timezone)

moment(date, format).tz(timezone)

ধরে নিলাম যে পাসের তারিখটিতে একটি সময় অঞ্চল নির্দিষ্ট করা হয়নি:

প্রথম কোডটি তারিখটি গ্রহণ করে এবং ধরে নিয়েছে যে টাইমজোনটি পাস হয়েছে।

উদাহরণ:

moment.tz('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss', 'UTC').format() // "2018-07-17T19:00:00Z"

moment('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss').tz('UTC').format() // "2018-07-18T00:00:00Z"

আমার টাইমজোনটি ইউটিসি থেকে +5। সুতরাং প্রথম ক্ষেত্রে এটি পরিবর্তন হয় না এবং এটি utc টাইমজোন করার জন্য তারিখ এবং সময় নির্ধারণ করে।

দ্বিতীয় ক্ষেত্রে, এটি ধরে নিয়েছে যে পাসের তারিখটি -5-এ, তারপরে এটি ইউটিসিতে পরিণত হয় এবং এজন্যই এটি "2018-07-18T00: 00: 00Z" তারিখটি ছিটকে দেয়

দ্রষ্টব্য: ফর্ম্যাট প্যারামিটারটি সত্যই গুরুত্বপূর্ণ। বাদ দেওয়া মুহুর্তটি তারিখ শ্রেণিতে ফিরে যেতে পারে যা অবিশ্বাস্য আচরণ করতে পারে


ধরে নিলাম টাইমজোনটি পাসের তারিখে নির্দিষ্ট করা হয়েছে:

এই ক্ষেত্রে তারা উভয়ই সমান আচরণ করে


যদিও এখন আমি বুঝতে পারি কেন এটি সেভাবে কাজ করে তবে আমি ভেবেছিলাম এটি একটি বিভ্রান্তিকর বৈশিষ্ট্য এবং ব্যাখ্যা করার মতো।


1
moment (...)। tz কোনও ফাংশন নয়
কে - এসও তে বিষক্রিয়া বাড়ছে।

5
আপনি কি মুহূর্ত-সময় অঞ্চল ইনস্টল করেছেন?
নিকোলা পেদ্রেটি

বিন্যাস ছাড়াই পার্স এবং রূপান্তরিত মুহুর্ত ফিরে পাওয়ার কোনও উপায় আছে? উদাহরণস্বরূপ, আমি যদি আবার সমস্ত কিছু ভাগ না করেই বিভিন্ন উপায়ে ফর্ম্যাট করতে চাই।
JEremyB

এটি স্পষ্ট করার জন্য আপনাকে ধন্যবাদ - ব্যবহারকারীর ব্রাউজারের সময় অঞ্চল থেকে আলাদা সময় অঞ্চল নির্ধারণ করার সময় আমার সমস্যা হয়েছিল এবং এটিই সঠিক সমস্যা ছিল।
রবিন স্কাফ

20

.zone () অবমূল্যায়ন করা হয়েছে এবং এর পরিবর্তে আপনার utcOffset ব্যবহার করা উচিত:

// for a timezone that is +7 UTC hours
moment(1369266934311).utcOffset(420).format('YYYY-MM-DD HH:mm')

8

মোমেন্ট.জেএস এর সাথে আমারও একই সমস্যা ছিল। আমি মুহুর্ত-সময় অঞ্চল ইনস্টল করেছি, কিন্তু সমস্যাটির সমাধান হয়নি। তারপরে, আমি এখানে যা প্রকাশ পেয়েছিলাম ঠিক তাই করেছি, টাইমজোনটি সেট করেছিলাম এবং এটি একটি কবজির মতো কাজ করে:

moment(new Date({your_date})).zone("+08:00")

অনেক ধন্যবাদ!


16
আপনার new Date()কনস্ট্রাক্টর ব্যবহার করা উচিত নয় । মুহুর্তগুলি আপনাকে তারিখগুলি বিশ্লেষণের জন্য প্রয়োজনীয় সমস্ত কিছু সরবরাহ করে। দেখুন পার্সিং ডক্স।
চুপচাপ 21

হ্যাঁ, তবে আমি যদি এটি না করি তবে আমি মুহুর্তের কাছ থেকে একটি সতর্কতা পেয়ে যাচ্ছি যে এটি এর মতো কিছু থেকে
অবহিত হয়েছে

7
সতর্কবার্তাটির অর্থ মুহুর্তটি অভ্যন্তরীণভাবে আপনি ঠিক কী করছেন ( new Date()অভ্যন্তরীণভাবে ব্যবহার করছেন ) তার পিছনে ফিরে আসছেন , তবে এটি ব্রাউজারগুলিতে অসঙ্গতিপূর্ণ । পরিবর্তে, আপনার দ্বিতীয় আর্গুমেন্ট হিসাবে প্রত্যাশিত বিন্যাস সরবরাহ করা উচিত। উদাহরণ: moment("12-25-1995", "MM-DD-YYYY")
নিরবতা

4

এটি কেবল একরোস এসেছে, এবং যেহেতু আমার একই সমস্যা ছিল, আমি কেবল যে ফলাফলগুলি নিয়ে এসেছি তা পোস্ট করব

পার্সিংয়ের সময় আপনি অফসেটটি আপডেট করতে পারবেন (অর্থাত্ আমি একটি ডেটা পার্স করছি (১.১.২০১))) এবং আমি কেবল তারিখটি চাই, 1 লা জানুয়ারী 2014. GMT + 1 এ আমি 31.12.2013 পেয়ে যাব তাই আমি প্রথমে মানটি অফসেট করব।

moment(moment.utc('1.1.2014').format());

ওয়েল, সময় অঞ্চলগুলি জুড়ে সমর্থন করার জন্য আমার কাজে এসেছিল

বি


-7

আপনি এটি চেষ্টা করতে পারেন,

এখানে আপনি ক্লায়েন্ট টাইমজোন (ব্রাউজার) এর উপর ভিত্তি করে তারিখটি পেতে পারেন।

moment(new Date().getTime()).zone(new Date().toString().match(/([-\+][0-9]+)\s/)[1]).format('YYYY-MM-DD HH:mm:ss')

রেজেক্স মূলত আপনাকে অফসেট মান দেয়।

চিয়ার্স !!


সাধারণত, মুহূর্ত আপনাকে আপনার প্রয়োজনীয় সমস্ত কিছু দেয়। আপনার কখনই কোনও রীতিনীতি মেলাতে হবে না।
মহেশ সমুদ্র
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.