ডিএসটি (দিবালোক সংরক্ষণের সময়) কার্যকর হয় কিনা তা কীভাবে পরীক্ষা করবেন এবং যদি তাই হয় তবে অফসেটটি কীভাবে হবে?


154

এটি আমার জেএস কোডের একটি অংশ যার জন্য এটি প্রয়োজন:

var secDiff = Math.abs(Math.round((utc_date-this.premiere_date)/1000));
this.years = this.calculateUnit(secDiff,(86400*365));
this.days = this.calculateUnit(secDiff-(this.years*(86400*365)),86400);
this.hours = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)),3600);
this.minutes = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)),60);
this.seconds = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)-(this.minutes*60)),1);

আমি ডেটটাইমটি "পূর্ববর্তী" পেতে চাই, তবে ডিএসটি যদি ব্যবহারে থাকে তবে তারিখগুলি ২৪ ঘন্টা বন্ধ থাকে। আমি জানি না কীভাবে ডিএসটি কার্যকর রয়েছে কিনা তা যাচাই করতে হবে।

দিবালোক সংরক্ষণ কখন শেষ হবে এবং শেষ হবে তা আমি কীভাবে জানতে পারি?

উত্তর:


313

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

নোট করুন যে ইউটিসির পশ্চিমে অঞ্চলগুলির জন্য কয়েক মিনিটের ধনাত্মক সংখ্যক getTimezoneOffsetপ্রত্যাবর্তন করে , যা সাধারণত নেতিবাচক ঘন্টা হিসাবে বর্ণিত হয় (যেহেতু তারা "ইউটিসির পিছনে" থাকে)। উদাহরণ হিসেবে বলা যায়, লস এঞ্জেলেস হয় ইউটিসি-8h স্ট্যান্ডার্ড, ইউটিসি-7h ডিএসটি। পরিবর্তে ডিসেম্বরে (শীতকালীন, মান সময়), রিটার্ন (480 মিনিট) দেয় । এটি পূর্ব গোলার্ধের জন্য নেতিবাচক সংখ্যাগুলি প্রদান করে (যেমন শীতকালে সিডনিতে, এটি "এগিয়ে" থাকা সত্ত্বেও ( ইউটিসি + 10 ঘন্টা )।getTimezoneOffset480-480-600

Date.prototype.stdTimezoneOffset = function () {
    var jan = new Date(this.getFullYear(), 0, 1);
    var jul = new Date(this.getFullYear(), 6, 1);
    return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
}

Date.prototype.isDstObserved = function () {
    return this.getTimezoneOffset() < this.stdTimezoneOffset();
}

var today = new Date();
if (today.isDstObserved()) { 
    alert ("Daylight saving time!");
}

28
আমি যাচাই করতে পারি যে এটি আন্তর্জাতিকভাবে কাজ করে। বর্তমানে কোনও টাইম অঞ্চল নেই যা ডিএসটি-র এমন কোনও ফর্ম ব্যবহার করে যেখানে ১ লা জানুয়ারি এবং ১ লা জুলাই উভয়ই ডিএসটি সময়কালের বাইরে বা উভয়ই বাইরে। এছাড়াও, টিজেডডিবি-র সর্বকালের জোনে ( একটি তুচ্ছ ব্যতিক্রম সহ ) দুটি অফসেটের বৃহতটি ডিএসটি অফসেট। যেহেতু জাভাস্ক্রিপ্টের getTimezoneOffsetবিপরীত মানটি প্রত্যাবর্তন করে, তাই Math.maxপ্রকৃতপক্ষে মানসম্পন্ন অফসেটটি ফিরিয়ে দিচ্ছে । কোডটি সঠিক।
ম্যাট জনসন-পিন্ট

7
যাইহোক, যদি কোনো সময় অঞ্চল কি কখনো এর সংজ্ঞা পরিবর্তন যেমন যে জানুয়ারী 1 ম এবং জুলাই 1st উভয় পারেন উভয় ডিএসটি, বা উভয় না ডিএসটি (এবং ডিএসটি এখনও প্রযোজ্য), তারপর এই কোড would না যে জোনে হবে।
ম্যাট জনসন-পিন্ট

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

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

1
এটি কীভাবে সঠিক হতে পারে? উদাহরণস্বরূপ জার্মানি ২০১০-১০-৩০ এ ডিএসটিতে প্রবেশ করেছিল, যখন আমেরিকা এক সপ্তাহ পরে ২০১-11-১১-০6 এ প্রবেশ করেছিল। এর মতো খারাপ তথ্য হ'ল এই জাতীয় জিনিসগুলি কেন ঘটায়: macworld.co.uk/news/apple/…
ড্যানিয়েল এফ

22

দুটি তারিখ তৈরি করুন: একটি জুনে, একটি জানুয়ারিতে। তাদের getTimezoneOffset () মানগুলির তুলনা করুন।

  • যদি জানুয়ারী অফসেট> জুন অফসেট হয়, ক্লায়েন্টটি উত্তর গোলার্ধে
  • জানুয়ারী অফসেট হলে <জুন অফসেট, ক্লায়েন্ট দক্ষিণ গোলার্ধে আছে
  • কোনও পার্থক্য না থাকলে ক্লায়েন্টের সময় অঞ্চল ডিএসটি পালন করে না

এখন বর্তমান তারিখের getTimezoneOffset () পরীক্ষা করুন।

  • যদি জুনের সমান, উত্তর গোলার্ধ, তবে বর্তমান টাইমজোনটি ডিএসটি (+1 ঘন্টা) হয়
  • যদি জানুয়ারীর সমান, দক্ষিণ গোলার্ধ, তবে বর্তমান টাইমজোনটি ডিএসটি (+1 ঘন্টা)

কেন আপনার গোলার্ধের দরকার? এটি কি যথেষ্ট হবে না যে বর্তমানের তারিখের জন্য getTimezoneOffset () যদি দুটি getTimezoneOffset () এর ডিএসটি এর চেয়ে ছোটটির সমান হয়? [এবং অফসেটটি কি
উভয়ের

গ্রহণযোগ্য উত্তর পরিষ্কারভাবে দেখায় যেহেতু আপনাকে গোলার্ধের দরকার নেই :)
জন নাইল্যান্ডার

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

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

আপনি জানুয়ারি থেকে জুলাইয়ের মধ্যে (বা ফেব্রুয়ারি এবং আগস্ট, মার্চ এবং সেপ্টেম্বর ইত্যাদির মধ্যে) চেক করুন কারণ এগুলি 6 মাসের ব্যবধানে।
কেপুল 1

17

এই উত্তরটি গৃহীত উত্তরের সাথে বেশ সমান, তবে Dateপ্রোটোটাইপটিকে ওভাররাইড করে না এবং কেবলমাত্র দুটির চেয়ে দিবালোক সঞ্চয় সময় কার্যকর হয় কিনা তা পরীক্ষা করতে কেবল একটি ফাংশন কল ব্যবহার করে।


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

দিবালোক সঞ্চয় সময় ঘড়ির কাঁটা এগিয়ে চলেছে , জাভাস্ক্রিপ্ট সর্বদা স্ট্যান্ডার্ড সময়ের মধ্যে আরও বেশি মান দেয়। অতএব, জানুয়ারি থেকে জুলাইয়ের মধ্যে ন্যূনতম অফসেট পাওয়া ডিএসটি-র সময় টাইমজোন অফসেট পাবে।

তারপরে আমরা তারিখের সময় অঞ্চলটি সর্বনিম্ন মানের সমান কিনা তা পরীক্ষা করে দেখি। যদি তা হয় তবে আমরা ডিএসটিতে আছি; অন্যথায় আমরা না।

নিম্নলিখিত ফাংশনটি এই অ্যালগরিদম ব্যবহার করে। এটা একটা তারিখ বস্তু, লাগে d, এবং আয় trueযদি দিবালোক সঞ্চয় সময় যে তারিখের জন্য কার্যকরী, এবং falseযদি না হয় তাহলে:

function isDST(d) {
    let jan = new Date(d.getFullYear(), 0, 1).getTimezoneOffset();
    let jul = new Date(d.getFullYear(), 6, 1).getTimezoneOffset();
    return Math.max(jan, jul) != d.getTimezoneOffset(); 
}

1
এটি কাজ করে, তবে বর্তমান টাইম জোনে যদি কোনও ডিএসটি না থাকে তবে এটির ফলাফলও সত্য হবে, যা সঠিক নয়। আপনি যদি এটিতে স্যুইচ করেন Math.max(...) != d.get...(), যদি ডিএসটি প্রদত্ত টাইমজোনটিতে পর্যবেক্ষণ করা হয় এবং তারিখটি বর্তমানে ডিএসটিতে রয়েছে তবে এটি সত্য হবে। যদি ডিএসটি পালন করা হয় না বা তারিখটি স্ট্যান্ডার্ড অফসেটের সাথে মেলে তবে এটি মিথ্যা হবে।
গ্রেজেজ

12

আমি আজ এই একই সমস্যার মুখোমুখি হয়েছিলাম কিন্তু যেহেতু আমাদের দিবালোক সংরক্ষণ মার্কিন যুক্তরাষ্ট্রে (কমপক্ষে আমার বোঝার থেকে) বিভিন্ন সময়ে শুরু হয় এবং বন্ধ হয়ে যায়, তাই আমি কিছুটা আলাদা রুট ব্যবহার করেছি ..

var arr = [];
for (var i = 0; i < 365; i++) {
 var d = new Date();
 d.setDate(i);
 newoffset = d.getTimezoneOffset();
 arr.push(newoffset);
}
DST = Math.min.apply(null, arr);
nonDST = Math.max.apply(null, arr);

তারপরে কোনটি মিলছে তা দেখতে আপনি কেবল ডিএসটি এবং ননডিএসটি-র সাথে অফসেটের বর্তমান টাইমজোনটি তুলনা করুন।


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

365 মান তৈরি করার দরকার নেই, একটি বাইনারি অনুসন্ধানের পদ্ধতি যা অফসেটের পরিবর্তন নির্ধারিত হওয়ার সাথে সাথে থামবে খুব বেশি দক্ষ হওয়া উচিত, এমনকি যেখানে দিবালোক সংরক্ষণ পালন করা হয় না। এই সমস্ত পদ্ধতির ধারণা করা হয় যে প্রতি বছর জায়গাগুলি দিবালোক সংরক্ষণ পালন করে, যা অগত্যা সত্য নয় necess স্থানগুলি সময়ে সময়ে দিবালোক সংরক্ষণ গ্রহণ করে এবং ত্যাগ করে (যদিও ECMAScript বর্তমান নিয়মগুলি ধরে নেয়, সে যাই হোক না কেন, সর্বদা প্রয়োগ হয়)।
রবজি

2
রব - বাইনারি অনুসন্ধানের মাধ্যমে আপনি কীভাবে এটি করতে পারেন যদি আপনি কোথায় অনুসন্ধান করতে জানেন না (যেমন আপনি যে জায়গাটি সন্ধান করছেন সেটি পরীক্ষার পয়েন্টের উপরে বা নীচে?)
এপ্লেগ

9

শেল্ডন গ্রিফিন প্রদত্ত সমাধান সম্পর্কে ম্যাট জোহানসনের মন্তব্যের ভিত্তিতে আমি নিম্নলিখিত কোডটি তৈরি করেছি:

    Date.prototype.stdTimezoneOffset = function() {
        var fy=this.getFullYear();
        if (!Date.prototype.stdTimezoneOffset.cache.hasOwnProperty(fy)) {

            var maxOffset = new Date(fy, 0, 1).getTimezoneOffset();
            var monthsTestOrder=[6,7,5,8,4,9,3,10,2,11,1];

            for(var mi=0;mi<12;mi++) {
                var offset=new Date(fy, monthsTestOrder[mi], 1).getTimezoneOffset();
                if (offset!=maxOffset) { 
                    maxOffset=Math.max(maxOffset,offset);
                    break;
                }
            }
            Date.prototype.stdTimezoneOffset.cache[fy]=maxOffset;
        }
        return Date.prototype.stdTimezoneOffset.cache[fy];
    };

    Date.prototype.stdTimezoneOffset.cache={};

    Date.prototype.isDST = function() {
        return this.getTimezoneOffset() < this.stdTimezoneOffset(); 
    };

এটি সমস্ত মন্তব্য বিবেচনা করে এবং পূর্বে প্রস্তাবিত উত্তরগুলি এবং বিশেষত এটিকে আমলে নেওয়ার জন্য সমস্ত বিশ্বের সেরাটি পাওয়ার চেষ্টা করে:

1) স্টাডিটাইমজোনঅফসেট প্রতি বছর ফলাফলের জন্য ক্যাচ করে যাতে একই বছরে একাধিক তারিখ পরীক্ষা করার সময় আপনার এটি পুনরায় গণনার প্রয়োজন হয় না।

২) এটি ধরে নেওয়া যায় না যে ডিএসটি (এটি যদি বিদ্যমান থাকে) অগত্যা জুলাইয়ে রয়েছে, এবং এটি কোনও পর্যায়ে এবং কোনও জায়গাতে কোনও মাস হবে এমনকি কাজ করবে। তবে পারফরম্যান্স-ভিত্তিতে এটি দ্রুত কাজ করবে যদি সত্যিই জুলাই (বা মাসের কাছাকাছি) সত্যই ডিএসটি হয়।

3) আরও খারাপ ক্ষেত্রে এটি প্রতি মাসের প্রথমটির getTimezoneOffset তুলনা করবে। [এবং পরীক্ষিত বছরে একবার এটি করুন]।

এটি এখনও অনুমান করে যে ডিএসটি পিরিয়ড যদি হয় তবে এক মাসের বেশি হয়।

কেউ যদি এই ধারণাটি সরিয়ে নিতে চান তবে তিনি হারুন কোলের সরবরাহিত সলুটিনের মতো আরও কিছুতে লুপটি পরিবর্তন করতে পারেন - তবে আমি তখনও অর্ধেক বছর এগিয়ে লাফ দিয়ে বেরিয়ে পড়তাম এবং যখন দুটি ভিন্ন অফসেট পাওয়া যায়]


4

Moment.js গ্রন্থাগার একটি উপলব্ধ .isDst()নামার সময় এসে বস্তুর উপর পদ্ধতি।

মুহূর্ত # isDST পরীক্ষা করে যদি বর্তমান মুহূর্তটি দিবালোক সংরক্ষণের সময় হয়।

moment([2011, 2, 12]).isDST(); // false, March 12 2011 is not DST
moment([2011, 2, 14]).isDST(); // true, March 14 2011 is DST

আমি চেষ্টা করেছি বার মুহুর্ত = প্রয়োজন ('মুহূর্ত'); this.logger.info (মুহূর্ত ([2011, 2, 12])। isDST ()); this.logger.info (মুহূর্ত ([2011, 2, 14])। isDST ()); উভয়ই মিথ্যা
লোগান_বি

ডিএসটি পরিবর্তনের তারিখগুলি দেশগুলির মধ্যে , এমনকি একই দেশের রাজ্যগুলির মধ্যে (যেমন আরিজোনা রাজ্য) পৃথক হয়। মার্কিন যুক্তরাষ্ট্রে এটি ছিল ২০১১-০৩-২০১৩ তে, জার্মানিতে এটি ছিল ২০১১-০৩-৩১-তে সুতরাং ফলাফলের যার উপর নির্ভর করে পৃথক হবে টাইমজোন moment.js কাজ কনফিগার করা হয়েছে।
ড্যানিয়েল এফ

1
এমনকি এটি অ্যারিজোনা সময়
ড্যানিয়েল এফ

3

getTimezoneOffset()জাভাস্ক্রিপ্টে পদ্ধতি, একটি ব্রাউজারে, 00:00 সময় অঞ্চল থেকে অফসেট মিনিট সংখ্যার উল্লেখ করে। উদাহরণস্বরূপ, ডাইটলাইট সেভিংসে (ডিএসটি) আমেরিকা / নিউ_ইয়র্ক সময় অঞ্চলটি 300 নম্বরটি দেয় 300 300 মিনিট শূন্য থেকে 5 ঘন্টার পার্থক্য। 60 মিনিট দ্বারা বিভক্ত 300 মিনিট 5 ঘন্টা। প্রতিটি টাইম জোনকে শূন্য সময় অঞ্চল, +00: 00 / ইত্যাদি / জিএমটি / গ্রিনিচ সময়ের সাথে তুলনা করা হয়।

MDN ওয়েব ডক্স

পরবর্তী জিনিসটি যা আপনাকে অবশ্যই জানতে হবে তা হ'ল অফসেটটিতে আসল টাইম জোনের বিপরীত চিহ্ন রয়েছে।

সময় অঞ্চল সম্পর্কে তথ্য ইন্টারনেট বরাদ্দকৃত সংখ্যা কর্তৃপক্ষ (আয়ন) দ্বারা পরিচালিত হয়

আয়নার সময় অঞ্চল

টাইম জোনের একটি সুন্দর বিন্যাসিত টেবিল joda.org সরবরাহ করে

জোদা-সময় সময় অঞ্চল

+00: 00 বা ইত্যাদি / GMT গ্রিনিচ সময়

সর্বকালের অঞ্চলগুলি +00: 00 / "ইত্যাদি / GMT" / গ্রিনউইচ সময় থেকে অফসেট করা হয়

ডাইটলাইট সেভিংস সময় গ্রীষ্মের "নিয়মিত" সময়ের চেয়ে সর্বদা আগের সময়। আপনি শরতের মরসুমে আপনার ঘড়ি আবার সেট করেছেন। ("পিছনে পড়া" স্লোগানটি কী করতে হবে তা মনে রাখতে)

সুতরাং, আমেরিকা / নিউ_ইয়র্ক সময় দিবালোক সঞ্চয় (শীতকালীন) সময় নিয়মিত সময়ের এক ঘন্টা আগে। সুতরাং, উদাহরণস্বরূপ, গ্রীষ্মে নিউইয়র্ক শহরে বিকেলে সাধারণত 5 টা বাজে যা এখন আমেরিকা / নিউ_ইয়র্ক সময় ডাইটলাইট সেভিংসে 4 টা বেজে যায়। "আমেরিকা / নিউ_ইয়র্ক" সময় নামটি "লং ফর্ম্যাট" টাইম জোনের নাম। মার্কিন পূর্ব উপকূল সাধারণত তাদের সময় অঞ্চলকে পূর্ব স্ট্যান্ডার্ড সময় (EST) বলে

আপনি যদি আজকের টাইম জোনের অফসেটকে অন্য কোনও তারিখের টাইম জোনের অফসেটের সাথে তুলনা করতে চান তবে আপনাকে জানতে হবে যে সময় অঞ্চলটির অফসেটের গাণিতিক চিহ্ন (+/- "ইতিবাচক / নেতিবাচক") টাইম জোনের বিপরীত।

Joda.org- এ সময় অঞ্চল সারণীটি দেখুন এবং "আমেরিকা / নিউ_ইয়র্ক" এর জন্য সময় অঞ্চলটি সন্ধান করুন এটি স্ট্যান্ডার্ড অফসেটের সামনে একটি নেতিবাচক চিহ্ন থাকতে পারে।

পৃথিবীটি তার অক্ষের উপরে ঘড়ির কাঁটার বিপরীতে ঘোরায়। নিউ ইয়র্ক সিটির কেউ সূর্যোদয় দেখার 5 ঘন্টা আগে গ্রিনউইচে সূর্যোদয় দেখেন এমন কোনও ব্যক্তি সূর্যোদয় দেখেন। মার্কিন যুক্তরাষ্ট্রের পশ্চিম উপকূলের কেউ সূর্যোদয় দেখে আমেরিকার পশ্চিম উপকূলের কেউ সূর্যোদয় দেখতে পাবে।

আপনার এই সমস্ত কিছু জানতে হবে এমন একটি কারণ রয়েছে। যাতে আপনি বছরের বিভিন্ন সময় প্রতিটি টাইম জোনের পরীক্ষা না করে কিছু জাভাস্ক্রিপ্ট কোড সঠিকভাবে ডিএসটি স্ট্যাটাস পাচ্ছেন কিনা তা যৌক্তিকভাবে নির্ধারণ করতে সক্ষম হবেন।

কল্পনা করুন যে এটি নিউইয়র্ক সিটির নভেম্বর, এবং ঘড়িগুলি এক ঘন্টা পিছনে ফিরে এসেছিল। নিউ ইয়র্ক সিটিতে গ্রীষ্মে, অফসেটটি 240 মিনিট বা 4 ঘন্টা হয়।

আপনি জুলাই মাসের একটি তারিখ তৈরি করে এবং তারপরে অফসেট পেয়ে পরীক্ষা করতে পারেন।

var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();

console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)

ব্রাউজারের বিকাশকারী সরঞ্জামগুলির কনসোল লগটি কী মুদ্রণ করবে?

উত্তর: 240

সুতরাং, এখন আপনি জানুয়ারীতে একটি তারিখ তৈরি করতে পারেন এবং শীত মৌসুমে অফসেট টাইম জোনের জন্য আপনার ব্রাউজারটি কী ফিরিয়ে দেয় তা দেখতে পারেন।

var Jan_Date = new Date(2017, 0, 1);//Month is zero indexed - Jan is zero
var jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();

console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)

উত্তর: 300

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

var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();

console.log('todaysTimeZone : ' + todaysTimeZone)

উত্তর:? - বছরের সময় উপর নির্ভর করে

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

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

today's TZ Offset !== Summer TZ Offset

আচ্ছা, আজ কি শীত নাকি গ্রীষ্মে? যদি আপনি জানতেন তবে নীচের যুক্তিটি প্রয়োগ করতে পারেন:

if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
  var are_We_In_DST = true;
}

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

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

চূড়ান্ত যুক্তি হ'ল:

if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
  var are_We_In_DST = true;
}

ব্রাউজারের সময় অঞ্চলটি ডিএসটি ব্যবহার করে কিনা তা নির্ধারণের জন্য কার্য:

function is_DST_Used_In_This_TimeZone() {
  var Jan_Date, jan_Timezone_OffSet, July_Date, july_Timezone_OffSet 
      offsetsNotEqual, thisYear, today;

  today = new Date();//Create a date object that is now
  thisYear = today.getFullYear();//Get the year as a number

  Jan_Date = new Date(thisYear, 0, 1);//Month is zero indexed - Jan is zero
  jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();

  console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)

  July_Date = new Date(thisYear, 6, 1);
  july_Timezone_OffSet = July_Date.getTimezoneOffset();

  console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)

  offsetsNotEqual = july_Timezone_OffSet !== jan_Timezone_OffSet;//True if not equal

  console.log('offsetsNotEqual: ' + offsetsNotEqual);

  return offsetsNotEqual;//If the offsets are not equal for summer and
       //winter then the only possible reason is that DST is used for
       //this time zone
}

ডেটঅ্যান্ডটাইম ডটকম অনুসারে, ডিএসটি 2019 সালের 10 ই মার্চ থেকে শুরু হয়েছিল, এবং তাই গ্রীষ্মে হয় শীত নয়, এবং নিউইয়র্কের ডিএসটি অফসেট -4, -5 নয়।
jk7

উত্তরে যদি কোনও উন্নতি বা সমাধানের প্রয়োজন হয় তবে দয়া করে একটি সম্পাদনা করুন, এবং এটি পর্যালোচনা করা হবে।
অ্যালান ওয়েলস

2

মোমেন্ট.জেএস ব্যবহার করুন ( https://momentjs.com/ )

moment().isDST(); দিবা আলোর সঞ্চয় পালন করা হলে আপনাকে দেবে।

এছাড়াও এটি আপনার জন্য আপেক্ষিক সময় গণনা করতে সহায়ক ফাংশন রয়েছে। আপনাকে ম্যানুয়াল গণনাগুলি করার দরকার নেই যেমনmoment("20200105", "YYYYMMDD").fromNow();


1

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

newDateWithOffset = new Date(utc + (3600000*(offset)));

এটি এখনও ভুল হতে পারে এবং তারা ডিএসটিতে থাকলে এক ঘণ্টার বাইরে। আপনার বর্তমানে রিমোট টাইম অ্যাকাউন্টের প্রয়োজন যদি তারা বর্তমানে তাদের ডিএসটির অভ্যন্তরে থাকে বা না থাকে এবং সে অনুযায়ী সামঞ্জস্য করে। এটি গণনা করে দেখুন এবং আপনার ঘড়িটি এতে পরিবর্তন করুন - ২/১/২০১৫ বলুন এবং ডিএসটি বাইরে যেমন ঘড়িটি এক ঘন্টা পিছনে পুনরায় সেট করুন। তারপরে এমন কোনও জায়গার জন্য অফসেটের জন্য গণনা করুন যা এখনও ২ ঘন্টা পিছনে থাকা উচিত। এটি দুই ঘন্টা উইন্ডো থেকে এক ঘন্টা এগিয়ে প্রদর্শিত হবে। আপনার এখনও ঘন্টা এবং অ্যাকাউন্ট সামঞ্জস্য করতে হবে। আমি এটি এনওয়াই এবং ডেনভারের জন্য করেছি এবং ডেনভারে সর্বদা ভুল (ঘন্টা এগিয়ে) চলেছি।


1

আমি খুঁজে পেয়েছি যে মোমেন্ট.জেস লাইব্রেরিটি এখানে বর্ণিত কিছু ধারণার সাথে (জানুয়ার থেকে জুনের তুলনা করা) খুব ভাল কাজ করে।

এই সহজ ফাংশনটি ডায়ালাইট সেভিংয়ের সময়টি ব্যবহারকারী যে টাইমজোনটিতে রয়েছে তা ফিরিয়ে দেবে:

function HasDST() {
    return moment([2017, 1, 1]).isDST() != moment([2017, 6, 1]).isDST();
}

এটি (উইন্ডোজে) কাজ করে কিনা তা যাচাই করার একটি সহজ উপায় হ'ল আপনার টাইমজোনটি একটি নন ডিএসটি অঞ্চলে পরিবর্তন করা, উদাহরণস্বরূপ অ্যারিজোনা মিথ্যা প্রত্যাবর্তন করবে, যেখানে ইএসটি বা পিএসটি সত্য হবে।

এখানে চিত্র বর্ণনা লিখুন


1

ভবিষ্যতের প্রুফ সমাধান যা সর্বকালের জোনে কাজ করে

  1. xদিবালোকের সঞ্চয়গুলি ব্যয় না করে সুদের বছরে প্রত্যাশিত মিলিসেকেন্ডের সংখ্যা হয়ে উঠুক ।
  2. সুদের তারিখের বছরের শুরু থেকে মহাকাশকাল থেকে yমিলিসেকেন্ডের সংখ্যাটি আসুন ।
  3. পূর্ণ তারিখ এবং আগ্রহের যুগের সময় zথেকে মিলিসেকেন্ডের সংখ্যাটি আসুন
  4. যাক tউভয়ের বিয়োগ হতে xএবং yথেকে z: z - y - x। এটি ডিএসটি এর কারণে অফসেট দেয়।
  5. যদি tশূন্য হয়, তবে ডিএসটি কার্যকর হবে না। যদি tশূন্য না হয়, তবে ডিএসটি কার্যকর হবে।

(function(){"use strict";
function dstOffsetAtDate(dateInput) {
    var fullYear = dateInput.getFullYear()|0;
	// "Leap Years are any year that can be exactly divided by 4 (2012, 2016, etc)
 	//   except if it can be exactly divided by 100, then it isn't (2100,2200,etc)
 	//	  except if it can be exactly divided by 400, then it is (2000, 2400)"
	// (https://www.mathsisfun.com/leap-years.html).
    var isLeapYear = ((fullYear & 3) | (fullYear/100 & 3)) === 0 ? 1 : 0;
	// (fullYear & 3) = (fullYear % 4), but faster
    //Alternative:var isLeapYear=(new Date(currentYear,1,29,12)).getDate()===29?1:0
    var fullMonth = dateInput.getMonth()|0;
    return (
        // 1. We know what the time since the Epoch really is
        (+dateInput) // same as the dateInput.getTime() method
        // 2. We know what the time since the Epoch at the start of the year is
        - (+new Date(fullYear, 0, 0)) // day defaults to 1 if not explicitly zeroed
        // 3. Now, subtract what we would expect the time to be if daylight savings
        //      did not exist. This yields the time-offset due to daylight savings.
        - ((
            ((
                // Calculate the day of the year in the Gregorian calendar
                // The code below works based upon the facts of signed right shifts
                //    • (x) >> n: shifts n and fills in the n highest bits with 0s 
                //    • (-x) >> n: shifts n and fills in the n highest bits with 1s
                // (This assumes that x is a positive integer)
                (31 & ((-fullMonth) >> 4)) + // January // (-11)>>4 = -1
                ((28 + isLeapYear) & ((1-fullMonth) >> 4)) + // February
                (31 & ((2-fullMonth) >> 4)) + // March
                (30 & ((3-fullMonth) >> 4)) + // April
                (31 & ((4-fullMonth) >> 4)) + // May
                (30 & ((5-fullMonth) >> 4)) + // June
                (31 & ((6-fullMonth) >> 4)) + // July
                (31 & ((7-fullMonth) >> 4)) + // August
                (30 & ((8-fullMonth) >> 4)) + // September
                (31 & ((9-fullMonth) >> 4)) + // October
                (30 & ((10-fullMonth) >> 4)) + // November
                // There are no months past December: the year rolls into the next.
                // Thus, fullMonth is 0-based, so it will never be 12 in Javascript
                
                (dateInput.getDate()|0) // get day of the month
				
            )&0xffff) * 24 * 60 // 24 hours in a day, 60 minutes in an hour
            + (dateInput.getHours()&0xff) * 60 // 60 minutes in an hour
            + (dateInput.getMinutes()&0xff)
        )|0) * 60 * 1000 // 60 seconds in a minute * 1000 milliseconds in a second
        - (dateInput.getSeconds()&0xff) * 1000 // 1000 milliseconds in a second
        - dateInput.getMilliseconds()
    );
}

// Demonstration:
var date = new Date(2100, 0, 1)
for (var i=0; i<12; i=i+1|0, date.setMonth(date.getMonth()+1|0))
    console.log(date.getMonth()+":\t"+dstOffsetAtDate(date)/60/60/1000+"h\t"+date);
date = new Date(1900, 0, 1);
for (var i=0; i<12; i=i+1|0, date.setMonth(date.getMonth()+1|0))
    console.log(date.getMonth()+":\t"+dstOffsetAtDate(date)/60/60/1000+"h\t"+date);

// Performance Benchmark:
console.time("Speed of processing 16384 dates");
for (var i=0,month=date.getMonth()|0; i<16384; i=i+1|0)
    date.setMonth(month=month+1+(dstOffsetAtDate(date)|0)|0);
console.timeEnd("Speed of processing 16384 dates");
})();

আমি বিশ্বাস করি যে উপরের কোড স্নিপেট বিভিন্ন কারণে এখানে পোস্ট করা সমস্ত উত্তরগুলির চেয়ে উচ্চতর।

  • এই উত্তরটি সর্বকালের জোনে এমনকি অ্যান্টার্কটিকা / ক্যাসিতেও কাজ করে
  • দিবালোকের সঞ্চয়গুলি পরিবর্তনের অধীনে। এটি হতে পারে যে এখন থেকে 20 বছর পরে, কোনও দেশে সাধারণ 2 এর পরিবর্তে 3 ডিএসটি পিরিয়ড থাকতে পারে D এই কোডটি ডিএসটি কার্যকর হয় বা কার্যকর হয় না কেবল তা নয়, মিলিসেকেন্ডে ডিএসটি অফসেটটি ফিরিয়ে দিয়ে সেই ক্ষেত্রে পরিচালনা করে।
  • বছরের মাসের আকার এবং লিপ ইয়ার্স যেভাবে কাজ করে তা আমাদের সময়কে সূর্যের সাথে ট্র্যাক করে রাখতে পুরোপুরি ফিট করে। হেক, এটি এত নিখুঁতভাবে কাজ করে যে আমরা যা করি তা হ'ল এখানে এবং সেখানে কেবল কয়েক সেকেন্ড সামঞ্জস্য । আমাদের লিপ বছরের বর্তমান ব্যবস্থাটি ফেব্রুয়ারি 24, 1582 থেকে কার্যকর হয়েছে এবং সম্ভবত ভবিষ্যতের জন্য কার্যকর থাকবে।
  • এই কোডটি টাইমজোনগুলিতে কাজ করে যা ডিএসটি ব্যবহার করে না।
  • এই কোডটি historicতিহাসিক সময়ে কার্যকর হয়েছিল যখন ডিএসটি কার্যকর হয়েছিল (যেমন 1900 এর দশকে)।
  • এই কোডটি সর্বাধিক পূর্ণসংখ্যা-অনুকূলিত এবং কড়া লুপে ডাকা হলে আপনাকে কোনও সমস্যা দেওয়া উচিত নয়। উপরের কোড স্নিপেট চালানোর পরে, পারফরম্যান্স বেনমার্ক দেখতে আউটপুট নীচে স্ক্রোল করুন। আমার কম্পিউটারটি Chrome এ ms 97ms এ 16384 তারিখগুলি প্রক্রিয়া করতে সক্ষম।

তবে, আপনি যদি ২ টি ডিএসটি পিরিয়ডের জন্য প্রস্তুতি নিচ্ছেন না, তবে নীচের কোডটি বুলিয়ান হিসাবে কার্যকর হয় কিনা তা নির্ধারণের জন্য ব্যবহার করা যেতে পারে।

function isDaylightSavingsInEffect(dateInput) {
    // To satisfy the original question
    return dstOffsetAtDate(dateInput) !== 0;
}

0

আমাকে সম্প্রতি ইউটিসি এবং ডিএসটি দিয়ে একটি তারিখের স্ট্রিং তৈরি করতে হবে এবং শেল্ডনের উত্তরের ভিত্তিতে আমি এটি একসাথে রেখেছি:

Date.prototype.getTimezone = function(showDST) {
    var jan = new Date(this.getFullYear(), 0, 1);
    var jul = new Date(this.getFullYear(), 6, 1);

    var utcOffset = new Date().getTimezoneOffset() / 60 * -1;
    var dstOffset = (jan.getTimezoneOffset() - jul.getTimezoneOffset()) / 60;

    var utc = "UTC" + utcOffset.getSign() + (utcOffset * 100).preFixed(1000);
    var dst = "DST" + dstOffset.getSign() + (dstOffset * 100).preFixed(1000);

    if (showDST) {
        return utc + " (" + dst + ")";
    }

    return utc;
}
Number.prototype.preFixed = function (preCeiling) {
    var num = parseInt(this, 10);
    if (preCeiling && num < preCeiling) {
        num = Math.abs(num);
        var numLength		 = num.toString().length;
        var preCeilingLength = preCeiling.toString().length;
        var preOffset		 = preCeilingLength - numLength;
        for (var i = 0; i < preOffset; i++) {
            num = "0" + num;
        }
    }
    return num;
}
Number.prototype.getSign = function () {
    var num	 = parseInt(this, 10);
    var sign = "+";
    if (num < 0) {
        sign = "-";
    }
    return sign;
}

document.body.innerHTML += new Date().getTimezone() + "<br>";
document.body.innerHTML += new Date().getTimezone(true);
<p>Output for Turkey (UTC+0200) and currently in DST: &nbsp; UTC+0300 (DST+0100)</p>
<hr>


0

ব্যবহার করে কোন সমস্যা আছে? Date.toString().indexOf('Daylight Time') > -1

"" + new Date()

শনি জানুয়ারী 1000 100050:00:00:00 GMT-0500 (পূর্ব স্ট্যান্ডার্ড সময়)

"" + new Date(...)

সান মে 0100033 00:00:00 GMT-0400 (পূর্ব দিবালোক সময়)

এটি সমস্ত ব্রাউজারের সাথে সামঞ্জস্যপূর্ণ বলে মনে হচ্ছে।


হ্যাঁ, এটি সারা বিশ্ব জুড়ে কাজ করে না। ইউরোপে গ্রীষ্মে, আপনি পাবেন"Thu Jul 02 2020 14:07:01 GMT+0200 (Central European Summer Time)"
তাদেজ ক্রেভ

0

ES6 স্টাইল

Math.min(...[0, 6].map(v => new Date(95, v, 1).getTimezoneOffset() * -1));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.