টাইমজোনটি সাবধান করুন
কেবলমাত্র এক তারিখ উপস্থাপনের জন্য ডেট অবজেক্টটি সরাসরি ব্যবহার করা আপনাকে একটি বিশাল অতিরিক্ত নির্ভুলতার সমস্যায় ফেলবে। এগুলি দূরে রাখতে আপনাকে সময় এবং সময় অঞ্চল পরিচালনা করতে হবে এবং তারা যে কোনও পদক্ষেপে পিছনে লুকিয়ে থাকতে পারে। এই প্রশ্নের গৃহীত উত্তর ফাঁদে পড়ে।
একটি জাভাস্ক্রিপ্ট তারিখের সময় অঞ্চল সম্পর্কে কোনও ধারণা নেই । এটি একটি মুহূর্ত (যুগের পর থেকে টিক্স) সাথে স্ট্রিং-এ অনুবাদ করার জন্য হ্যান্ডি (স্ট্যাটিক) ফাংশন সহ ডিফল্টরূপে ডিভাইসের "স্থানীয়" টাইমজোন ব্যবহার করে, বা নির্দিষ্ট করে বলা হয়, ইউটিসি বা অন্য কোনও টাইমজোন। একটি তারিখের অবজেক্টের সাথে সবেমাত্র-তারিখকে উপস্থাপন করতে, আপনি চান যে তারিখগুলি প্রশ্নটির তারিখের শুরুতে মধ্যরাতে ইউটিসির প্রতিনিধিত্ব করবে। এটি একটি সাধারণ এবং প্রয়োজনীয় কনভেনশন যা তাদের সৃষ্টির মরসুম বা সময় অঞ্চল নির্বিশেষে আপনাকে তারিখগুলি নিয়ে কাজ করতে দেয়। সুতরাং আপনি যখন আপনার মধ্যরাতের ইউটিসি তারিখের অবজেক্টটি তৈরি করবেন এবং যখন আপনি এটি সিরিয়াল করবেন তখন উভয়ই সময় অঞ্চলটির ধারণাটি পরিচালনা করার জন্য আপনাকে খুব সজাগ থাকতে হবে।
কনসোলের ডিফল্ট আচরণে প্রচুর লোকেরা বিভ্রান্ত হয়। আপনি যদি কনসোলে কোনও তারিখ স্প্রে করেন তবে আপনি যে আউটপুটটি দেখছেন তাতে আপনার টাইমজোন অন্তর্ভুক্ত থাকবে। এটি কেবল কারণ যা toString()
আপনার তারিখে কনসোল কল করে এবং toString()
আপনাকে একটি স্থানীয় নিন্দা দেয়। অন্তর্নিহিত তারিখটির কোনও টাইমজোন নেই ! (এতক্ষণ সময়টি অফসেট টাইমজোনটির সাথে মিলিত হওয়ার পরে, আপনার এখনও একটি মধ্যরাতের ইউটিসি তারিখ অবজেক্ট রয়েছে)
ডিসরিয়ালাইজিং (বা মধ্যরাতের ইউটিসি তারিখের অবজেক্ট তৈরি করা)
এটি দুটি গোলাকেন্দ্রিক পদক্ষেপ, সেই কৌশলটির সাথে দুটি "সঠিক" উত্তর রয়েছে। বেশিরভাগ সময়, আপনি আপনার তারিখটি ব্যবহারকারীর সময় অঞ্চলটি প্রতিফলিত করতে চান। আজ আপনার জন্মদিন হলে ক্লিক করুন । এনজেড এবং মার্কিন যুক্তরাষ্ট্রে ব্যবহারকারীরা একই সাথে ক্লিক করেন এবং বিভিন্ন তারিখ পান। সেক্ষেত্রে, এটি করুন ...
// create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));
কখনও কখনও, আন্তর্জাতিক তুলনামূলক স্থানীয় নির্ভুলতা ট্রাম্প। সেক্ষেত্রে, এটি করুন ...
// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));
একটি তারিখের ডিসিজায়ালাইজ করুন
প্রায়শই তারের তারিখগুলি YYYY-MM-DD ফর্ম্যাটে থাকবে। এগুলি deserialize করতে, এটি করুন ...
var midnightUTCDate = new Date( dateString + 'T00:00:00Z');
Serializing
আপনি তৈরি করার সময় টাইমজোন পরিচালনা করার যত্ন নিয়েছেন, আপনি যখন স্ট্রিং উপস্থাপনায় ফিরে যাবেন তখন আপনার অবশ্যই টাইমজোনটি বাইরে রাখার বিষয়ে নিশ্চিত হওয়া উচিত। সুতরাং আপনি নিরাপদে ব্যবহার করতে পারেন ...
toISOString()
getUTCxxx()
getTime() //returns a number with no time or timezone.
.toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.
এবং সম্পূর্ণরূপে অন্য সব কিছু এড়িয়ে চলুন, বিশেষত ...
getYear()
, getMonth()
,getDate()
সুতরাং আপনার প্রশ্নের উত্তর দিতে, 7 বছর খুব দেরী ...
<input type="date" onchange="isInPast(event)">
<script>
var isInPast = function(event){
var userEntered = new Date(event.target.valueAsNumber); // valueAsNumber has no time or timezone!
var now = new Date();
var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() ));
if(userEntered.getTime() < today.getTime())
alert("date is past");
else if(userEntered.getTime() == today.getTime())
alert("date is today");
else
alert("date is future");
}
</script>
এটি চলমান দেখুন ...
2019 আপডেট করুন ... ফ্রি স্টাফ ...
এই উত্তরের জনপ্রিয়তা দেওয়া, আমি এগুলি সব কোডে রেখেছি। নিম্নলিখিত ফাংশনটি একটি মোড়ানো তারিখের অবজেক্ট প্রদান করে এবং কেবলমাত্র একটি তারিখ with সহ নিরাপদে থাকা সেই ফাংশনগুলি উন্মোচিত করে ™
এটি একটি তারিখ অবজেক্টের সাথে কল করুন এবং এটি ব্যবহারকারীর সময় অঞ্চল প্রতিফলিত জাস্টাডেটে সমাধান করবে to স্ট্রিং সহ এটিকে কল করুন: যদি স্ট্রিংটি টাইমজোন নির্দিষ্ট করে একটি আইএসও 8601 হয় তবে আমরা সময়ের অংশটি সরিয়ে ফেলব। যদি সময় অঞ্চল নির্দিষ্ট না করা থাকে, আমরা তারিখের অবজেক্টের মতো, স্থানীয় সময় অঞ্চলকে প্রতিফলিত করে একটি তারিখে রূপান্তর করব।
function JustADate(initDate){
var utcMidnightDateObj = null
// if no date supplied, use Now.
if(!initDate)
initDate = new Date();
// if initDate specifies a timezone offset, or is already UTC, just keep the date part, reflecting the date _in that timezone_
if(typeof initDate === "string" && initDate.match(/((\+|-)\d{2}:\d{2}|Z)$/gm)){
utcMidnightDateObj = new Date( initDate.substring(0,10) + 'T00:00:00Z');
} else {
// if init date is not already a date object, feed it to the date constructor.
if(!(initDate instanceof Date))
initDate = new Date(initDate);
// Vital Step! Strip time part. Create UTC midnight dateObj according to local timezone.
utcMidnightDateObj = new Date(Date.UTC(initDate.getFullYear(),initDate.getMonth(), initDate.getDate()));
}
return {
toISOString:()=>utcMidnightDateObj.toISOString(),
getUTCDate:()=>utcMidnightDateObj.getUTCDate(),
getUTCDay:()=>utcMidnightDateObj.getUTCDay(),
getUTCFullYear:()=>utcMidnightDateObj.getUTCFullYear(),
getUTCMonth:()=>utcMidnightDateObj.getUTCMonth(),
setUTCDate:(arg)=>utcMidnightDateObj.setUTCDate(arg),
setUTCFullYear:(arg)=>utcMidnightDateObj.setUTCFullYear(arg),
setUTCMonth:(arg)=>utcMidnightDateObj.setUTCMonth(arg),
addDays:(days)=>{
utcMidnightDateObj.setUTCDate(utcMidnightDateObj.getUTCDate + days)
},
toString:()=>utcMidnightDateObj.toString(),
toLocaleDateString:(locale,options)=>{
options = options || {};
options.timezone = "UTC";
locale = locale || "en-EN";
return utcMidnightDateObj.toLocaleDateString(locale,options)
}
}
}
// if initDate already has a timezone, we'll just use the date part directly
console.log(JustADate('1963-11-22T12:30:00-06:00').toLocaleDateString())
date1 === date2
ধারাবাহিক আচরণ সরবরাহ করা হয় না বলে মনে হয়; এটা করাdate1.valueOf() === b.valueOf()
বা এমনকি ভালdate1.getTime() === date2.getTime()
। Strangeness।