আপনি কীভাবে জাভাস্ক্রিপ্টের তারিখটিকে ইউটিসিতে রূপান্তর করবেন?


590

মনে করুন আপনার ওয়েবসাইটের কোনও ব্যবহারকারী একটি তারিখের সীমাতে প্রবেশ করেছে।

2009-1-1 to 2009-1-3

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

এখন ধরুন ব্যবহারকারী আলাস্কা বা হাওয়াই বা ফিজিতে আছেন। যেহেতু তারা টাইমজোনটি ইউটিসি থেকে একেবারেই আলাদা, তাই তারিখের সীমাটি এরকম কিছুতে রূপান্তর করা দরকার:

2009-1-1T8:00:00 to 2009-1-4T7:59:59

জাভাস্ক্রিপ্ট তারিখ অবজেক্টটি ব্যবহার করে আপনি কীভাবে প্রথম "স্থানীয়করণ" তারিখের সীমাটি সার্ভারটি বুঝতে পারবেন এমন কোনও কিছুতে রূপান্তর করবেন?


10
এটি পুনরুত্থিত করা কারণ এটি আমার জন্য শীর্ষস্থানীয় গুগল হিট এবং নতুন ব্রাউজারগুলি ইউটিসি তারিখের স্ট্রিংয়ের জন্য অন্তর্নির্মিত সমর্থন করেছে।
jcomeau_ictx

4
আমি নতুন ECMAscript 5 toISOString () পদ্ধতিটি হাইলাইট করার জন্য গৃহীত উত্তরটি আপডেট করেছি। দেখুন stackoverflow.com/a/11957822/19112
dthrasher

5
সুতরাং 2015 সালে আমি স্ট্রিংফাইং এবং তারিখগুলি পার্সিংয়ের সাথে ঝামেলা করতে হবে? হাস্যকর!
টুলকিট

2
অবশ্যই আপনার আছে। আপনি অন্য কারও জন্য কাজটি করাতে কখনই নির্ভর করতে পারবেন না :- পি যতক্ষণ না পৃথিবী টাইমজোনগুলি ব্যবহার বন্ধ করে দেয় এবং তারিখ এবং সময়গুলিকে একত্রিত না করে।
এরেনর পাজ

4
"স্টারডেটস", পছন্দসই।
মাইকেল ডাব

উত্তর:


370

toISOString()পদ্ধতি সরলীকৃত বর্ধিত আইএসও ফরম্যাট (একটি স্ট্রিংকে ফেরৎ আইএসও 8601 ), যা সবসময় 24 বা 27 অক্ষর দীর্ঘ (হয় YYYY-MM-DDTHH:mm:ss.sssZবা ±YYYYYY-MM-DDTHH:mm:ss.sssZযথাক্রমে)। টাইমজোনটি সর্বদা শূন্য ইউটিসি অফসেট থাকে, যা প্রত্যয় দ্বারা চিহ্নিত করা হয় " Z"।

উত্স: MDN ওয়েব ডক্স

আপনার প্রয়োজনীয় বিন্যাসটি .toISOString()পদ্ধতিটি দিয়ে তৈরি করা হয়েছে । পুরানো ব্রাউজারগুলির জন্য (ie8 এবং নীচে), যা এই পদ্ধতিটি স্থানীয়ভাবে সমর্থন করে না, শিম এখানে পাওয়া যাবে :

এটি আপনাকে যা প্রয়োজন তা করার ক্ষমতা দেয়:

var isoDate = new Date('yourdatehere').toISOString();

টাইমজোন কাজের জন্য, moment.js এবং moment.js টাইমজোনটি সত্যই মূল্যবান সরঞ্জাম ... বিশেষত ক্লায়েন্ট এবং সার্ভার জাভাস্ক্রিপ্টের মধ্যে টাইমজোন নেভিগেট করার জন্য।


81
প্রকৃতপক্ষে এটি তারিখের অবজেক্টটিকে স্ট্রিংয়ে রূপান্তরিত করে, এর উপর আর তারিখ ক্রিয়াকলাপ করতে সক্ষম হবে না
orszaczky

2
@ দ্য রিবেল, প্রদত্ত ইউজ-কেসটি হ'ল তাকে সার্ভারকে একটি ফর্ম্যাট স্ট্রিং প্রেরণ করতে হবে।
স্টার্ন হবে

28
@ উইল, আপনি পুরোপুরি ঠিক বলেছেন, তবে - যেমন আমি এখানে বেশিরভাগ দর্শকের ধারণা নিয়েছি - আমি শিরোনামের ভিত্তিতে এখানে পৌঁছেছি, সাধারণ জেএস তারিখটি ইউটিসি রূপান্তর করার জন্য অনুসন্ধান করেছি, তাই আমি এখানে এটি উল্লেখ করা দরকারী বলে মনে করি :)
orszaczky

4
এই পদ্ধতিটি ব্যবহার করার সময় সতর্ক থাকুন! এটি কোনও ইউটিসি তারিখ তৈরি করে না - এটি বিদ্যমান তারিখের ডেটাটিকে ইউটিসি ফর্ম্যাটে রূপান্তর করে এবং এটি একটি "জেড" টাইমজোন দেয়। এটি 99% সময় ভুল! এই পদ্ধতিটি ব্যবহারের আগে আপনাকে অবশ্যই তারিখটি GMT টাইমজোনতে রূপান্তর করতে হবে!
ব্যবহারকারী 1944491

5
@ user1944491 আমি এটি সঠিক বলে মনে করি না। এমডিএন ডক্স অনুসারে, toISOStringইউটিসি-তে সঠিকভাবে রূপান্তর করে না [toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offsetএছাড়াও উদাহরণস্বরূপ তারা দেখায় যে অফসেটটি যখন আইসএসটিআরিং বলা হয় তখন তার হিসাব হয়
এফএফএফ

560

সহজ এবং বোকা

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);

85
আমি আপনার ধারণাটি পছন্দ করেছি এবং একটি পদ্ধতি আমি বহুবার ব্যবহার করেছি did function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
টিম

21
ইউটিসির তারিখ এবং সময়টি অর্জন করার জন্য আমি সবচেয়ে সংক্ষিপ্ত কোডটি প্রকাশ করেছি সময় অঞ্চলটি বন্ধ করে দিয়ে:new Date(new Date().toUTCString().substr(0, 25))
জোয়েলভ

17
নোট করুন যে getUTCMonth () 0 থেকে 11 পর্যন্ত মান দেয় So সুতরাং আপনার যদি স্ট্রিংয়ের পরিবর্তে সংখ্যা দ্বারা মাসের প্রয়োজন হয় তবে এটি মানটিকে +1 করতে সহায়তা করে।
তালভি ওয়াটিয়া

19
এটা অপদার্থ. নতুন তারিখের আসলে আপনার চেয়ে আলাদা মান হবে। now.toUTCSTring()(ভুল) এর পরিবর্তে কেবল ব্যবহার করুন now_utc.toString()
বার্গি

22
আমি এটি ব্যবহার করব না - নতুন তারিখ ব্যবহার করে () আপনি ব্রাউজারের সময় অঞ্চল পাবেন। ক্রোম 29 এবং আই 10 তে, তারিখ + সময় সঠিক বলে মনে হচ্ছে তবে সময় অঞ্চলটি ব্রাউজারের টাইমজোনকে সেট করা হয়েছে যা সমস্যার কারণ হতে পারে ...
শান

207

আমার পদ্ধতিটি এখানে:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

ফলস্বরূপ utcঅবজেক্টটি সত্যই কোনও ইউটিসি তারিখ নয়, তবে ইউটিসি সময়ের সাথে মিলের জন্য স্থানীয় তারিখ স্থানান্তরিত হয়েছে (মন্তব্য দেখুন)। যাইহোক, অনুশীলনে এটি কাজ করে।


আমি সেই সমস্যার দিকে তাকিয়ে ছিলাম যখন বুঝতে পেরেছিলাম যে Date.now()ইউটিসি সময় নয় বরং স্থানীয় সময় দেয় এবং এই সমাধানটি আমার কাছে সবচেয়ে সহজ বলে মনে হয়। কমপক্ষে আমার ক্ষেত্রে যেখানে আমি ইউনিক্স সময় চাই এবং খুব সুন্দর বিন্যাসিত স্ট্রিংটি চাই না। (পার্থক্যটি ছিল কেবলমাত্র আমি 60 * 1000অতিরিক্ত স্পষ্ট হওয়ার জন্য গুণ করেছিলাম :))
টিমোথী বাউচার

18
60000 * তারিখ.সেটটাইমজোনঅফসেট () যুক্ত করা ভুল! প্রথমত, আপনাকে অবশ্যই সমস্ত তারিখ / টাইমসকে ডিসেম্বরের উদ্দেশ্যে টাইমজোন সংশোধক সহ ইউটিসি হিসাবে ইতিমধ্যে ভাবতে হবে। ব্রাউজারগুলি ভিন্ন হতে পারে, তবে ডেট.জেটটাইম () 1970-01-01 সাল থেকে মিলিসেকেন্ডের সংখ্যা দেয়। আপনি যদি এই নম্বরটি ব্যবহার করে একটি নতুন তারিখ তৈরি করেন, যেমন: নতুন তারিখ (তারিখ.সেটটাইম ()); এটি ইউটিসি হবে , তবে আপনি এটি প্রদর্শন করার সময় (উদাহরণস্বরূপ: ক্রোম দেব সরঞ্জামসমূহ কনসোলের মাধ্যমে) এটি আপনার স্থানীয় সময় অঞ্চল হিসাবে উপস্থিত হবে।
অ্যারন হফম্যান

15
আমার ব্রাউজারে এটি একটি ডেটটাইম তৈরি করে যা ইউটিসি নয়। তবে আমার ব্রাউজারের মধ্যে প্রদর্শিত হলে, এটি আমার স্থানীয় সময় অঞ্চলে একটি ডেটটাইম প্রদর্শন করে যা টাইমজোন তথ্য উপেক্ষা করা হলে ইউটিসি সময় সঠিক হবে।
অ্যারন হফম্যান

গোটচা, আকর্ষণীয় বিষয়। আসুন তুলনা now.toString()সঙ্গে utc.toString(): কোন সময় অঞ্চল পরিবর্তন, কিন্তু সময় পরিবর্তন, যা পুরোপুরি একটি ভিন্ন জিনিস। যাইহোক, একটি ক্লিনার সমাধানটি আরও জটিল হবে (আমার ধারণা তাই), এবং এই কোডটি বেশিরভাগ ক্ষেত্রেই কাজ করে, যতক্ষণ না কেউ সময়সীমা নিয়ে কাজ করে না। এটি আমাকে হাঁসের ঘুষি সম্পর্কে স্মরণ করিয়ে দেয় : ভিন্ন জিনিস তবে একই রকম আচরণ করে made এছাড়াও দ্রষ্টব্য কোডার কোডে একই সমস্যা রয়েছে তা নোট করুন।
গ্রাস ডাবল

4
এই উত্তরটি "যুগের শিফটিং" এর আরেকটি সাধারণ বাস্তবায়ন দেখায় যা বিচ্ছিন্নকরণে বিপজ্জনক, কারণ এটি ডিএসটি ট্রানজিশনের মতো প্রান্তের ক্ষেত্রে ব্যর্থ হতে পারে। প্রস্তাবিত নয়।
ম্যাট জনসন-পিন্ট

25
Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}

Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}

এটি ভাল কাজ করে। একটি জাভাস্ক্রিপ্ট তারিখ তৈরি করতে আমার সূত্রের তারিখগুলিতে "/" প্রতিস্থাপন করার দরকার ছিল, তবে সঠিক আউটপুট পেতে আমি আপনার টোআইএসও () ফাংশনটিতে কল করতে পারি।
dthrasher

এটি দুর্দান্ত কাজ করে। আপনি ইউটিসিতে স্থানান্তরিত হয়ে গেছে এমন কোনও তারিখ অবজেক্ট ফিরে পেতে jQuery p .parseDate (...) এ ফলাফলও খাওয়াতে পারেন।
ব্রায়ান এলিস

23

তারিখ / সময় পরিবর্তন না করে আইএসওতে রূপান্তর করুন

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

তারিখ / সময় পরিবর্তনের সাথে আইএসওতে রূপান্তর করুন (তারিখ / সময় পরিবর্তিত হবে)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

ফিডল লিঙ্ক


সুতরাং এই ইউটিসি নকল? আমি আমার স্থানীয় তারিখটি স্থানান্তর করি এবং আমি আমার পিসি ক্লকটিতে যে তারিখ এবং সময়টি দেখি তা সত্যই আমি সার্ভারের কাছে জমা দিতে সফল হয়েছি। কি দারুন. যাইহোক স্ট্রিংফাইজিং এবং পার্সিংয়ের চেয়ে ভাল
টুলকিট

এছাড়াও আপনার .toISOString () এর দরকার নেই, আপনি কেবল সার্ভারে আইসোডেট পাঠাতে পারেন
টুলকিট

.toISOString () সহজ এবং সোজা, এর তারিখ বের হওয়া একটি অতিরিক্ত পদক্ষেপ হবে (আইসোডেট কোনও ফাংশন নয়)।
রোলারকোস্টা

আপনার কি এটির বিয়োগের পরিবর্তে অফসেট যুক্ত করার দরকার নেই? পড়ুন stackoverflow.com/a/11964609/832230
Acumenus

@ এ বি বি যদি বর্তমান টাইমজোন অফসেটটি + ve হয় তবে আমাদের এটি বিয়োগ করা উচিত (আমাদের ক্ষেত্রে আইএসটি +5: 30) অন্যথায় যুক্ত করুন।
রোলারকোস্টা

18

ব্রাউজারগুলি পৃথক হতে পারে এবং ক্লায়েন্টের দ্বারা উত্পাদিত কোনও তথ্যকে বিশ্বাস না করার কথাও আপনার মনে রাখা উচিত, যা বলা হচ্ছে, নীচের বিবৃতিটি আমার পক্ষে কাজ করে (ম্যাক ওএস এক্স 10.8.2 এ গুগল ক্রোম ভি 24)

var utcDate = new Date(new Date().getTime());


সম্পাদনা: "এটি কীভাবে ন্যায়বিচারের চেয়ে আলাদা new Date()?" এখানে দেখুন: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / তারিখ

  • যদি কোনও যুক্তি সরবরাহ না করা হয় তবে নির্ধারক সিস্টেমের সেটিংস অনুযায়ী বর্তমান তারিখ এবং সময়ের জন্য একটি জাভাস্ক্রিপ্ট তারিখ অবজেক্ট তৈরি করে।
  • দ্রষ্টব্য: যেখানে তারিখটিকে একাধিক যুক্তিযুক্ত নির্মাতা হিসাবে ডাকা হয়, নির্দিষ্ট আর্গুমেন্টগুলি স্থানীয় সময়কে উপস্থাপন করে। ইউটিসি পছন্দসই হলে একই যুক্তি সহ নতুন তারিখ ( তারিখ.ইউটিসি (...) ) ব্যবহার করুন । (দ্রষ্টব্য: তারিখ.ইউটিসি) 1970-01-01 00:00:00 ইউটিসির পর থেকে মিলিসেকেন্ডের সংখ্যা প্রদান করে)

পূর্ববর্তী উত্তরগুলি হিসাবে 60000 * তারিখ.সেটটাইমজোনঅফসেট () যুক্ত করা ভুল। প্রথমত, আপনাকে অবশ্যই সমস্ত তারিখ / টাইমসকে ডিসেম্বরের উদ্দেশ্যে টাইমজোন সংশোধক সহ ইউটিসি হিসাবে ইতিমধ্যে ভাবতে হবে।

আবার, ব্রাউজারগুলি পৃথক হতে পারে তবে ডেট.জেটটাইম () 1970-01-01 ইউটিসি / জিএমটি থেকে মিলসেকেন্ডের সংখ্যা দেয়। আমি উপরে হিসাবে এই নম্বরটি ব্যবহার করে যদি আপনি একটি নতুন তারিখ তৈরি করেন তবে এটি ইউটিসি / জিএমটি হবে। তবে, আপনি .toString () এ কল করে এটি প্রদর্শিত হলে এটি আপনার স্থানীয় সময় অঞ্চলে উপস্থিত হবে বলে মনে হয় কারণ .toString () আপনার স্থানীয় সময় অঞ্চল ব্যবহার করে, ডেটের অবজেক্টের টাইমজোনকে কল করা হয় না।

আমি এটিও খুঁজে পেয়েছি যে আপনি যদি একটি তারিখে .getTimezoneOffset () কল করেন তবে এটি আপনার স্থানীয় সময় অঞ্চলটি ফিরিয়ে দেবে, আপনি যে তারিখের অবজেক্টটিতে ফোন করেছিলেন তার সময়সীমাটি নয় (আমি তবে এটি মানক হিসাবে যাচাই করতে পারি না)।

আমার ব্রাউজারে, 60000 * ডেট.জেটটাইমজোনঅফসেট () যুক্ত করে একটি ডেটটাইম তৈরি করে যা ইউটিসি নয় । তবে যখন আমার ব্রাউজারের মধ্যে প্রদর্শিত হবে (উদা:। টু স্ট্রিং ()), এটি আমার স্থানীয় সময় অঞ্চলে একটি ডেটটাইম প্রদর্শন করে যা টাইমজোন তথ্য উপেক্ষা করা হলে ইউটিসি সময় সঠিক হবে।


11
আমি কেবল এফএক্স এবং ক্রোমে এই কোডটি চালিয়েছি, এটি কাজ করে বলে মনে হচ্ছে না: ফলাফলটি ঠিক একইরকম new Date(), টাইমস্ট্যাম্প বা টাইমজোনও বদলানো হয়নি
গ্রাস ডাবল

3
এর কারণ টাইমস্ট্যাম্পগুলি টাইমজোন-কম। new Date().getTime()টাইমজোন থেকে অজানাস্টিক এমন টাইমস্ট্যাম্প সর্বদা ফিরে আসবে। আপনি ইউনিক্স যুগের সময় থেকে মিলিসেকেন্ডের চেয়ে অন্য কিছুতে ফর্ম্যাট করার চেষ্টা না করা পর্যন্ত এর সাথে কোনও টাইমস্ট্যাম্প যুক্ত নেই।
বিটিটি

7
যতদূর আমি new Date(new Date().getTime())রিটার্নগুলি ঠিক একই মান হিসাবে বলতে পারি new Date()। আপনার উত্তরটি কোন অর্থে একটি পৃথক মান প্রদান করে তা ব্যাখ্যা করতে পারেন new Date()?
কर्क ওল

আমি আমার সার্ভারে এই মানটি পোস্ট করছি new Date("5/19/2014").getTime()। তারিখ নির্মাতা একটি +7 অফসেট সহ একটি তারিখ তৈরি করেছিলেন। সার্ভারে (সি #), আমি ইউনিক্সের যুগে পোস্ট মানকে মিলিসেকেন্ড হিসাবে যুক্ত করি new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000)। ফলাফল হয় 5/19/2014 7:00:00 AM। সুতরাং দেখে মনে হচ্ছে গেটটাইম () আমার ইউটিসি অফসেট সহ মিলিসেকেন্ডের সংখ্যা দেয়।
xr280xr

1
এমন অনেক মন্তব্য রয়েছে যা অভিযোগ করে যা new Date(new Date().getTime())কাজ করে না। আমি নিশ্চিত করতে পারি যে new Date(Date.UTC(2019, 8, 27, 0, 0, 0))সত্যই ইউটিসি সময় তৈরি করে। আপনি যদি ব্যবহার করতে ব্যর্থ হন তবে Date.UTC(...)আপনার সময় অঞ্চলে ইউটিসি অফসেটে তারিখগুলি পাবেন।
অ্যালেক্স বার্কার ২

15
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

1
তারিখ অবজেক্টটি আসলে একটি তারিখে সেট করা দরকার। উপরে কেবল একটি উদাহরণ।
জেমস স্কিডমোর

5
এখন এটি "থু, 04 জুন 2009 04:10:56 GMT" প্রদান করে, যা ওপি-তে প্রয়োজনীয় আইএসও ফর্ম্যাট নয়।
নিকফ

4
এটি এটিকে স্ট্রিংয়ে পরিণত করে, যা কোনও তারিখ নয়
অ্যান্টনি

2
না, আসলে এটি ওপি অনুসারে একটি তারিখের স্ট্রিং প্রতিনিধিত্ব হওয়া উচিত।
jcomeau_ictx

3
ইউটিসি-তে রূপান্তরিত হওয়ার পরে এটি স্ট্রিং ফর্ম্যাটে ফিরে আসবে, তারপরে কীভাবে পদ্ধতিগুলি অ্যাক্সেস করতে হবে getMonth (), getDate () ইত্যাদি
সন্দীপ Sandy

10

ইউটিসিতে রূপান্তর এবং এটি একটি তারিখ অবজেক্ট হিসাবে রাখার জন্য আরও একটি সমাধান: (এটি ফর্ম্যাটেড স্ট্রিংয়ের শেষে থেকে 'জিএমটি' অংশটি সরিয়ে, তারপরে এটি পুনরায় তারিখ নির্মাণকারীটিতে রেখে কাজ করে)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

ডেটটাইম চয়নকারী লাইব্রেরির সাথে ইন্টারফেস করার জন্য আমার এটি করা দরকার। তবে সাধারণভাবে খেজুর দিয়ে এভাবে কাজ করা খারাপ ধারণা।

ব্যবহারকারীরা সাধারণত তাদের স্থানীয় সময় তারিখের সাথে কাজ করতে চান, তাই আপনি হয় অফসেটের সাহায্যে ডেটটাইম স্ট্রিংগুলি সঠিকভাবে পার্স করতে সার্ভার সাইড কোডটি আপডেট করেন, তারপরে ইউটিসি (সেরা বিকল্প) এ রূপান্তর করুন বা আপনি প্রেরণের আগে কোনও ইউটিসি স্ট্রিং ক্লায়েন্ট-সাইডে রূপান্তর করুন the সার্ভার (উইল স্টারনের উত্তর মত)


7

আপনি কি তারিখটিকে এভাবে স্ট্রিংয়ে রূপান্তর করার চেষ্টা করছেন?

আমি এটি করার জন্য একটি ফাংশন করব এবং এটি কিছুটা বিতর্কিত হলেও এটি ডেট প্রোটোটাইপে যুক্ত করুন। যদি আপনি এটি করতে স্বাচ্ছন্দ্য বোধ করেন না, তবে আপনি প্যারামিটার হিসাবে তারিখটি পেরিয়ে স্ট্যান্ডেলোন ফাংশন হিসাবে রাখতে পারেন।

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

আপনার যদি ইউটিসির সময় এটির প্রয়োজন হয়, তবে সমস্ত get * ফাংশনগুলি getUTC * দিয়ে প্রতিস্থাপন করুন, যেমন: getUTCFullYear, getUTCMonth, getUTCHours ... এবং তারপরে ব্যবহারকারীর টাইমজোন অফসেটের পরিবর্তে শেষে "+00: 00" যুক্ত করুন।


1
এটি আমি প্রথম উদাহরণটি দেখেছি যে টাইমজোন অফসেট হ্যান্ডেল করার চেষ্টা করে, সুতরাং এটির জন্য +1। যাইহোক, আমি এটির সাথে বেশ কয়েকটি জিনিস পেয়েছি - টেম্প.সুবস্ট্রি (-2) ত্রুটি সৃষ্টি করে কারণ এটি একটি স্ট্রিং নয়, তাই আপনাকে "টেম্প = '' + টেম্পের মতো কিছু করতে হবে; প্রথমে এটিকে স্ট্রিংয়ে পরিণত করতে। এছাড়াও, আমি আমার আইএসও তারিখগুলিকে শূন্য-প্যাডযুক্ত পছন্দ করি - আমি মনে করি এটি তাদের আরও মানসম্পন্ন করে।
মিক সিয়ার

@ মিক - আমি এই বাগটি ঠিক করতে আপডেট করেছি। আমি অন্য দিন String(temp)থেকে ব্যবহার করেছি ( "" + temp) আজকাল JSLint ত্রুটি হিসাবে প্রতিবেদন করা হয়েছে।
নিকফ


7
date = '2012-07-28'; stringdate = new Date(date).toISOString();

সবচেয়ে নতুন ব্রাউজারে কাজ করা উচিত। এটি 2012-07-28T00:00:00.000Zফায়ারফক্স 6.0 এ ফিরে আসে


7

তারিখগুলির সাথে কাজ করার সময় আমার সুপারিশটি হ'ল ব্যবহারকারীর ইনপুট থেকে পৃথক ক্ষেত্রে তারিখটি পার্স করা। আপনি এটি পুরো স্ট্রিং হিসাবে ব্যবহার করতে পারেন তবে আপনি আগুন নিয়ে খেলছেন।

জাভাস্ক্রিপ্ট বিভিন্ন ফর্ম্যাটে দুটি সমান তারিখকে আলাদাভাবে আচরণ করতে পারে।

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

এর মতো কিছু কখনই করবেন না:

new Date('date as text');

একবার আপনার ব্যবহারকারীর ইনপুট থেকে আপনার তারিখটি পৃথক ক্ষেত্রগুলিতে পার্স করার পরে, একটি তারিখ অবজেক্ট তৈরি করুন। একবার তারিখ অবজেক্ট তৈরি হয়ে গেলে এটি টাইম অঞ্চল অফসেট যুক্ত করে এটি ইউটিসিতে রূপান্তর করে। ডিএসটি-র কারণে তারিখের অবজেক্ট থেকে অফসেটটি ব্যবহার করা কতটা জরুরি তা আমি চাপ দিতে পারছি না (এটি কেন অন্য কারণ তা প্রদর্শন করার জন্য)।

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

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


এফওয়াইআই গেটইয়ারকে ওয়েব স্ট্যান্ডার্ড ডেভেলপার
ঘাঁ

6

আপনি যদি খেজুরের সাথে অনেকগুলি व्यवहार করে থাকেন তবে moment.js ( http://momentjs.com ) ব্যবহার করা উপযুক্ত । ইউটিসিতে রূপান্তর করার পদ্ধতিটি হ'ল:

moment(yourTime).utc()

আপনি যে কোনও ফর্ম্যাটে আপনার তারিখ পরিবর্তন করতে আপনি ফর্ম্যাট ব্যবহার করতে পারেন:

moment(yourTime).utc().format("YYYY-MM-DD")

মুহুর্তে অফসেট বিকল্পগুলি রয়েছে তবে টাইমজোন ( http://momentjs.com/imezone/ ) সাথে ডিল করার জন্য একটি অতিরিক্ত পরিপূরক গ্রন্থাগার রয়েছে । সময় রূপান্তর এর মত সহজ হবে:

moment.tz(yourUTCTime, "America/New_York")

moment(yourTime).utc()এবং মধ্যে পার্থক্য কি moment.utc(yourTime)? আমি সাধারণত পরেরটি ব্যবহার করি।
PS0604

5

ক্লায়েন্ট-সাইডে টাইমজোনটি সেট করা যাই হোক না কেন আমার সমাধান তারিখটিকে একই রাখে। কেউ এটি দরকারী খুঁজে পাবেন।

আমার ব্যবহারের কেস:

আমি একটি টুডো অ্যাপ তৈরি করছি, যেখানে আপনি আপনার কাজের তারিখ নির্ধারণ করেছেন। আপনি যে টাইমজোনেই থাকুন না কেন এই তারিখটি স্থির থাকতে হবে।

উদাহরণ। আপনি 25 শে জুন সকাল 8 টায় আপনার বন্ধুকে কল করতে চান।

আপনি চীনে থাকাকালীন 5 দিন আগে (20 শে জুন) এই কাজটি তৈরি করেন।

তারপরে, একই দিনে, আপনি কয়েক দিনের জন্য নিউইয়র্কের ফ্লাইটে যান।

তারপরে ২৫ শে জুন, আপনি যখন নিউইয়র্কে রয়েছেন, তখন আপনি সকাল সাড়ে at টায় ঘুম থেকে ওঠেন (যার অর্থ আপনার 30 মিনিটের মধ্যে টাস্কের বিজ্ঞপ্তিটি পাওয়া উচিত (এমনকি এটি তৈরির সময় আপনি যেখানে ছিলেন সেখানে ইতিমধ্যে দুপুর দেড়টায়) কাজের)

তাই কাজটি সময় অঞ্চলটিকে উপেক্ষা করছে। এর অর্থ 'আমি যে টাইমজোন থাকব তা সকাল আটটায় করতে চাই'।

আমি যা করি তা বলা যাক 'আমি ধরে নিলাম আপনি সর্বদা লন্ডনের টাইমজোন - ইউটিসি'তে রয়েছেন।

এর অর্থ কী - যখন ব্যবহারকারী তার / তার টাইমজোনটিতে কিছু তারিখ রাখে - আমি এই তারিখটিকে ইউটিসিতে একই তারিখে রূপান্তর করি। অর্থাত। আপনি চীনে সকাল 8 টা বাছাই করেন তবে আমি এটি ইউটিসিতে সকাল 8 টায় রূপান্তর করি।

তারপরে - পরের বার আপনি অ্যাপটি খোলেন - আমি ইউটিসিতে সংরক্ষিত তারিখটি পড়েছি এবং এটি আপনার বর্তমান টাইমজোনটিতে একই তারিখে রূপান্তর করি - যেমন eg আমি নিউ ইয়র্কের টাইমজোনটিতে ইউটিসিতে সকাল 8 টায় 8 এ রূপান্তর করি।

এই সমাধানটির অর্থ হ'ল তারিখটি অন্য কিছু বোঝাতে পারে যখন আপনি এটি নির্ধারণের সময় কোথায় ছিলেন এবং আপনি কোথায় পড়ছেন, তবে এটি এমনভাবে স্থির থাকে যা আপনি সর্বদা একই সময় অঞ্চলে থাকায় 'অনুভূত' হয়।

আসুন কিছু কোড লিখি:

প্রথম - সময় অঞ্চলকে উপেক্ষা করে / ইউটিসি থেকে রূপান্তর করার জন্য আমাদের কাছে দুটি প্রধান ফাংশন রয়েছে:

export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
  const timestamp = Date.UTC(
    date.getFullYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds(),
  );

  return new Date(timestamp);
}

export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
  return new Date(
    utcDate.getUTCFullYear(),
    utcDate.getUTCMonth(),
    utcDate.getUTCDate(),
    utcDate.getUTCHours(),
    utcDate.getUTCMinutes(),
    utcDate.getUTCSeconds(),
    utcDate.getUTCMilliseconds(),
  );
}

তারপরে, আমি এই তারিখটি সংরক্ষণ করি / পড়েছি:

function saveTaskDate(localDate: Date) {
  // I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
  const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
  api.saveTaskDate(utcDate);
}

function readTaskDate(taskUtcDate: Date) {
  // I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
  const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);

  // this date will have the same calendar day as the one you've picked previously
  // no matter where you were saving it and where you are now
}

4

আমি সবেমাত্র আবিষ্কার করেছি যে স্টিভেন লেভিথনের তারিখ.ফর্ম্যাট.জেএস এর 1.2.3 সংস্করণটি আমি যা চাই তা করতে পারে। এটি আপনাকে জাভাস্ক্রিপ্টের তারিখের জন্য একটি ফর্ম্যাট স্ট্রিং সরবরাহ করতে দেয় এবং স্থানীয় সময় থেকে ইউটিসিতে রূপান্তরিত করে। আমি এখন যে কোডটি ব্যবহার করছি তা এখানে:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 

9
এটি আপনার প্রশ্নের সেরা উত্তর বলে মনে হচ্ছে না। আপনার এমন কোনও বিষয়ে পুনর্বিবেচনা করা উচিত যা সরাসরি আপনার প্রশ্নের উত্তর দেয় বা আপনার প্রশ্নকে অন্যভাবে জিজ্ঞাসা করে।
hitautodestruct

1
আমি এই সঠিক স্ক্রিপ্টটি (এবং সংস্করণ) ফিক্স করে যাচ্ছি কারণ এটি আই 7 এবং ফায়ারফক্সের পক্ষে অপর্যাপ্ত।
বারবারোসা

4

আমি jQuery বিশ্বায়ন প্লাগইন তারিখটি সেরা কাজ করার জন্য পার্সিংয়ের সন্ধান পেয়েছি । অন্যান্য পদ্ধতিগুলির মধ্যে ক্রস-ব্রাউজার সমস্যা ছিল এবং তারিখের মতো স্টাফ ছিল বেশ কিছুক্ষণের মধ্যে আপডেট করা হয়নি।

আপনার এই পৃষ্ঠায় ডেটপিকারেরও দরকার নেই। আপনি ডক্সে প্রদত্ত উদাহরণের সাথে সাদৃশ্যপূর্ণ কিছু কল করতে পারেন:

$.parseDate('yy-mm-dd', '2007-01-26');

1
কোনও কিছু আপডেট করা হয়নি কেবল তার অর্থ এটি ব্যবহার করা উচিত নয়। ডেট.জেস বছরের পর বছর ধরে তাই নিখুঁতভাবে কাজ করেছে, সুতরাং এটি আপডেট করার প্রয়োজন নেই। জেএস তারিখ অবজেক্ট এবং ব্যবহারের তারিখের ফর্ম্যাটগুলি গত কয়েক বছরে পরিবর্তিত হয়নি, তবে স্ক্রিপ্টটি কেন তাদের হেরফের করে? তারিখ.জেএস হ'ল একেবারে সেরা জেএস তারিখের পাঠাগার out গিথুবে এটির জন্য কয়েকটি সমস্যা রয়েছে তবে অন্যথায় এটি নিখুঁত। github.com/datejs/Datejs
thugsb

3

এই ফাংশনটি আমার জন্য সুন্দরভাবে কাজ করে।

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}


2
var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

এটি আপনাকে যথাযথ ইউটিসি তারিখ এবং সময় দেবে।
এটি কারণ getTimezoneOffset()আপনি মিনিটের মধ্যে সময় অঞ্চল পার্থক্য দেবেন। আমি আপনাকে প্রস্তাব দিচ্ছি যে ব্যবহার না করা toISOString()কারণ আউটপুট স্ট্রিংটিতে থাকবে তাই ভবিষ্যতে আপনি তারিখটি সামাল দিতে পারবেন না



2

আপনার যদি প্রয়োজন তারিখ অবজেক্ট

কেবলমাত্র তারিখের স্ট্রিংয়ের তারিখটি সময় অঞ্চল দ্বারা 00:00 এ স্থানান্তরিত হতে সময়কে ধরে নেয়:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

আপনি যদি বর্তমান ঘন্টা এবং মিনিট যোগ করেন তবে সঠিক তারিখ পান:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

1

আপনার প্রশ্নটির দিকে এটি স্পষ্ট যে আপনি পরবর্তী পোস্ট প্রসেসিংয়ের জন্য আপনার ব্যাকএন্ডে তারিখের সীমাটি প্রেরণ করতে চান clear

আমি ধরে নিচ্ছি যে আপনি স্ট্যান্ডার্ড ডেটা নির্দেশিকাগুলি মেনে চলেছেন যা ডেটা নির্দিষ্ট ফর্ম্যাটে থাকবে বলে আশা করে। উদাহরণস্বরূপ, আমি ওডিটিএ ব্যবহার করি যা একটি RESTfull এপিআই যা প্রত্যাশা করে যে তারিখের সময় অবজেক্টগুলি বিন্যাসে থাকবে: -

হল YYYY-MM-DDT00: 00: 00।

এটি নীচে পোস্ট করা স্নিপেটের মাধ্যমে সহজেই অর্জন করা যেতে পারে (দয়া করে আপনার প্রয়োজন অনুযায়ী ফর্ম্যাটটি পরিবর্তন করুন)।

var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";

অন্যদিকে, আপনি আমার এমন পরিস্থিতিতে আছেন যেখানে আপনি আপনার ব্যাকএন্ড থেকে একটি তারিখ পেয়েছেন এবং ব্রাউজারটি এটিকে আপনার স্থানীয় তারিখে রূপান্তর করে। অন্যদিকে আপনি ইউটিসি তারিখে আগ্রহী তারপর আপনি নিম্নলিখিতগুলি সম্পাদন করতে পারেন: -

var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);

উপরের কোড স্নিপেট মূলত টাইমজোন এর উপর ভিত্তি করে ব্রাউজারের দ্বারা যুক্ত / বিয়োগ সময়কে বিয়োগ করে / বিয়োগ করে।

উদাহরণস্বরূপ যদি আমি EST এ আছি (GMT-5) এবং আমার পরিষেবা একটি তারিখের সময় বস্তুটি ফেরত দেয় = বুধ আগস্ট 17 2016 00:00:00 GMT-0500 আমার ব্রাউজারটি স্বয়ংক্রিয়ভাবে আমার স্থানীয় সময় পাওয়ার জন্য টাইমজোন অফসেট (5 ঘন্টা) বিয়োগ করে। সুতরাং আমি যদি সময়টি আনতে চেষ্টা করি তবে আমি বুধ 16 ই আগস্ট 2016 19:00:00 GMT-0500 পেয়েছি। এর ফলে প্রচুর সমস্যা হয়। সেখানে অনেকগুলি লাইব্রেরি রয়েছে যা অবশ্যই এটিকে সহজ করে তুলবে তবে আমি খাঁটি জেএস পদ্ধতির ভাগ করতে চেয়েছিলাম।

আরও তথ্যের জন্য দয়া করে একবার দেখুন: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ আমি কোথায় পেয়েছি আমার অনুপ্রেরণা.

আশাকরি এটা সাহায্য করবে!


1

এই পদ্ধতিটি আপনাকে দেবে: 2017-08-04T11:15:00.000+04:30এবং আপনি সহজেই জোন ভেরিয়েবল উপেক্ষা করতে পারেন 2017-08-04T11:15:00.000

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}

1

মুহুর্তের প্যাকেজটি ব্যবহার করে আপনি সহজেই ইউটিসির একটি তারিখের স্ট্রিংকে একটি নতুন তারিখের অবজেক্টে রূপান্তর করতে পারেন:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

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


4
যদিও এটি প্রশ্নের উত্তর দিতে পারে, আপনার কোডের কোনও ব্যাখ্যা নেই। আপনি কী করছেন তার ব্যাখ্যা সরবরাহ করতে দয়া করে আপনার উত্তর আপডেট করুন। ধন্যবাদ!
মিরোস্লাভ গ্ল্যামুজিনা


0

আমি জানি এই প্রশ্নটি পুরানো, তবে এই একই সমস্যাটির দিকে চেয়ে ছিল এবং এর একটি বিকল্প হ'ল তারিখ.ভালিউঅফ () এর পরিবর্তে সার্ভারে প্রেরণ করা হবে। জাভাস্ক্রিপ্ট তারিখের মানOf () ফাংশনটি 1 ই জানুয়ারী, 1970 এর মধ্যরাত থেকে মিলিসেকেন্ডের সংখ্যা পাঠায় U

মান()


0

সুতরাং এইভাবেই আমাকে এটি করতে হয়েছিল কারণ আমি এখনও একটি জাভাস্ক্রিপ্টের তারিখ অবজেক্টটি চেয়েছিলাম যাতে তারিখ হিসাবে চালিত হয় এবং দুর্ভাগ্যবশত এই উত্তরগুলির অনেকগুলি আপনাকে স্ট্রিংয়ে যেতে হয়।

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 

0

সুতা যোগ মুহুর্ত

import moment from 'moment';

//local Js date to UTC using moment
const utcDate = moment.utc(moment(new date()).format('YYYY-MM-DDTHH:mm:ss')).valueOf();
console.log('UTC Date', utcDate);


// UTC to local date without moment
const localDate = convertUTCDateToLocalDate(new Date(utcDate))
console.log('UTC Date', moment(localDate).format('MMM D, YYYY HH:mm'));


function convertUTCDateToLocalDate(date) {

   let newDate = new Date(date.getTime() + date.getTimezoneOffset()*60*1000);

   const offset = date.getTimezoneOffset() / 60;
   const hours = date.getHours();

   newDate.setHours(hours - offset);

   return newDate;

}


-8

এমনকি সহজ

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);

2
এটি অসম্পূর্ণ। setTimeনির্ভর করে new Date, যা আপনি অন্তর্ভুক্ত করছেন না। উত্তরটি সম্পূর্ণ করুন।
এলোমেলো_ ব্যবহারকারী_নাম

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