ব্রাউজার থেকে ক্লায়েন্ট সময় অঞ্চল পান


139

ক্লায়েন্ট ব্রাউজার থেকে একটি সময় অঞ্চল পেতে একটি নির্ভরযোগ্য উপায় আছে? আমি নীচের লিঙ্কগুলি দেখেছি তবে আমি আরও দৃust় সমাধান চাই।

জাভাস্ক্রিপ্ট সহ একটি সময় অঞ্চল অটো সনাক্ত করে

জাভাস্ক্রিপ্টে টাইমজোন সনাক্তকরণ



8
আপনি উপরের সাথে লিঙ্ক করেছেন আমি jsTimezoneDtect লিখেছি, এবং পরিস্থিতিটি আমি গ্রহণ করি যে আপনি খাঁটি ক্রস ব্রাউজার জাভাস্ক্রিপ্ট (ভূ-স্থান এবং আইপি লকআপস ব্যতীত) পেতে পারেন যতই কাছাকাছি।
জন নিল্যান্ডার

উত্তর:


87

এই সংগ্রহস্থল পৃষ্ঠাগুলি দেখুন এটি সহায়ক

jstz.min.js ডাউনলোড করুন এবং আপনার এইচটিএমএল পৃষ্ঠায় একটি ফাংশন যুক্ত করুন

<script language="javascript">
    function getTimezoneName() {
        timezone = jstz.determine()
        return timezone.name();
    }
</script>

এবং আপনার প্রদর্শন ট্যাগ থেকে এই ফাংশন কল


13
টিএল; ডিআর আমরা এখন Intl.DateTimeFormat().resolvedOptions().timeZoneওয়ালেসের পরামর্শ অনুসারে (কোনও আইই 11 নেই) ব্যবহার করতে পারি ।
Code4R7

195

আধ দশক পরে আমাদের এটির জন্য একটি অন্তর্নির্মিত উপায় আছে! আধুনিক ব্রাউজারগুলির জন্য আমি এটি ব্যবহার করব:

const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tz);

এটি আইএএনএ টাইমজোন স্ট্রিংটি প্রদান করে তবে অফসেট নয়MDN রেফারেন্সে আরও জানুন ।

সামঞ্জস্যতা টেবিল - মার্চ 2019 পর্যন্ত, বিশ্বব্যাপী 90% ব্রাউজারগুলির ব্যবহারের জন্য কাজ করে। ইন্টারনেট এক্সপ্লোরারে কাজ করে না


4
ফায়ারফক্সে কাজ করে না: Intl.DateTimeFormat().resolvedOptions().timeZone->undefined
টমাস টোমেসেক

3
ফায়ারফক্স এবং আইই সম্পত্তিটি সমর্থন করছে না বলে মনে হয় :( ডেভেলপার.মোজিলা.আর.ইন.ইউএস
ওয়ালেস

5
Intl.DateTimeFormat().resolvedOptions().timeZoneফায়ারফক্স ৫২ থেকে শুরু হওয়া প্রত্যাশিত মানটি ফিরে আসবে: kangax.github.io/compat-table/esintl/…
জুলেন

কীভাবে এটি ব্যবহার করে ফর্ম? ডেভেলপার.মোজিলা.আর . / এন-ইউএস / ডকস / ওয়েবে / এইচটিএমএল / এলিমেট / ইনপুট / uponএর পরামর্শ অনুসারে কোনও লুকানো মান ?
হেন্ড্রি

4
ফায়ারফক্সে এখন কাজ করে
ডাস্টিন মিশেল

76

প্রায়শই যখন লোকেরা "টাইমজোনগুলি" সন্ধান করেন, কেবলমাত্র "ইউটিসি অফসেট "ই যথেষ্ট হবে। উদাহরণস্বরূপ, তাদের সার্ভারটি ইউটিসি +5 এ রয়েছে এবং তারা জানতে চায় যে তাদের ক্লায়েন্টটি ইউটিসি -8 এ চলছে


সাধারণ পুরানো জাভাস্ক্রিপ্ট (new Date()).getTimezoneOffset()/60ইউটিসি থেকে অফসেটের বর্তমান সংখ্যাটি ফিরিয়ে দেবে।

getTimezoneOffset()রিটার্ন মান (এমডিএন ডক্স থেকে) এর সাইন ইন একটি সম্ভাব্য "গোটচা" লক্ষ করার মতো :

টাইম-জোন অফসেটটি ইউটিসি এবং স্থানীয় সময়ের মধ্যে কয়েক মিনিটের মধ্যে পার্থক্য। মনে রাখবেন যে এর অর্থ অফসেটটি ইতিবাচক যদি স্থানীয় সময় অঞ্চলটি ইউটিসির পিছনে থাকে এবং যদি এগিয়ে থাকে তবে এটি নেতিবাচক হয়। উদাহরণস্বরূপ, টাইম জোনের ইউটিসি + 10: 00 (অস্ট্রেলিয়ান পূর্ব স্ট্যান্ডার্ড সময়, ভ্লাদিভোস্টক সময়, চমোরো স্ট্যান্ডার্ড সময়), -600 ফিরে আসবে।


তবে, আমি আপনাকে সময় / তারিখ সম্পর্কিত জাভাস্ক্রিপ্ট কোডের জন্য day.js ব্যবহার করার পরামর্শ দিচ্ছি । কোন ক্ষেত্রে আপনি চালিয়ে একটি আইএসও 8601 ফর্ম্যাটযুক্ত ইউটিসি অফসেট পেতে পারেন:

> dayjs().format("Z")
"-08:00"

এটি সম্ভবত উল্লেখ করা যায় যে ক্লায়েন্ট সহজেই এই তথ্যটি মিথ্যা করতে পারে।

(দ্রষ্টব্য: এই উত্তরটি মূলত https://momentjs.com/ কে সুপারিশ করেছে , তবে ডেজেস আরও আধুনিক, আরও ছোট বিকল্প)


30
এটি লক্ষ্য করার মতো হতে পারে যে অফসেট এবং সময় অঞ্চল অগত্যা একই জিনিস নয়।
ডেক্স

9
আপনি কেবল অফসেট দিয়ে কীভাবে ডিএসটি প্রয়োগ করবেন? এই অঞ্চলে অফসেটটি ভুল অর্ধেক বছর হয়। আইএমও টাইমজোনটি আরও সঠিক।
সেভেজম্যান

4
ডিএসটি কোনও নির্দিষ্ট সময়ে অফসেটের অংশ। শীতকালে মধ্য ইউরোপীয় সময় ইউটিসি + 01: 00 হয়। যাইহোক, যখন ডিএসটি প্রয়োগ করা হয় তখন সিইটিটি ইউটিসি +২০: ০২ হয়, যেমনটি এখন ডেনমার্কে যেখানে আমি আছি।
গার্ট সান্দারবি

1
এই কারণেই getTimezoneOffset () এর কাজ করার জন্য একটি তারিখ প্রয়োজন - এটি ডিএসটিতে কার্যকর হবে সেই সময়ে কার্যকর।
ওসামাবিনলগিন

2
দিবালোক সংরক্ষণ বিবেচনা করার সময় অফসেটটি সঠিক নয়।
গ্রেগ এল

48

আপাতত, এমবায়েলুনের উত্তরে প্রস্তাবিত সর্বোত্তম বাজি সম্ভবত জেএসটিজেট ।

সম্পূর্ণতার জন্য, এটি উল্লেখ করা উচিত যে এটির পথে একটি মান আছে: ইনটেল । আপনি ইতিমধ্যে এটি ক্রোমে দেখতে পারেন:

> Intl.DateTimeFormat().resolvedOptions().timeZone
"America/Los_Angeles"

(এটি আসলে মানটিকে অনুসরণ করে না, যা গ্রন্থাগারের সাথে লেগে থাকার আরও একটি কারণ)


1
ইন্টেল সাফারি বাদে সব কিছুতেই স্থির দেখায়। caniuse.com/#feat=internationalization
মাইকেল কোল

2
আপনি যদি ম্যানুয়ালি একটি নির্মাণের সময়সীমা নির্দিষ্ট না করে থাকেন তবে @ মিশেলকোলের কনফরম্যান্ট বাস্তবায়নগুলি সম্পত্তিটির জন্য Intlফিরে আসার কথা । পরিবর্তে সিস্টেমের টাইমজোনটি ফিরিয়ে ক্রোম মান থেকে বিচ্যুত হয়; জোহানেসের উত্তর এটিই কাজে লাগিয়েছে, তবে কেন তিনি বলেছেন যে "আসলে মানটি অনুসরণ করে না"। undefinedtimeZoneDateTimeFormat
ক্রিস জেস্টার-ইয়ং

20
এফওয়াইআই - স্ট্যান্ডার্ডটি এখন ইনটেল.ডেটটাইম ফর্ম্যাট ()। রেজোলিউশনডেপশনস () টাইমজোন
নেদার্বি


4

এখানে একটি jsfiddle আছে

এটি বর্তমান ব্যবহারকারীর টাইমজোনটির সংক্ষিপ্তসার সরবরাহ করে।

এখানে কোড নমুনা

var tz = jstz.determine();
console.log(tz.name());
console.log(moment.tz.zone(tz.name()).abbr(new Date().getTime()));

1
May 22 2015 03:45 PM CDT আমি যেমন ব্যবহার করেছি তারিখ প্রদর্শন করতে console.log(moment(now).format('MMM DD YYYY hh:mm A') + ' ' + moment.tz.zone(tz.name()).abbr(now.getTime()));
αƞজিβ

5
আপনার ফিডাল আর কাজ করছে না এবং কনসোলে ত্রুটি দিচ্ছে।
সওমিল

2

আমি জোশ ফ্রেজারের মতো নেওয়া মতামত ব্যবহার করেছি , যা ইউটিসি থেকে অফসেট ব্রাউজারের সময় নির্ধারণ করে এবং এটি ডিএসটিকে স্বীকৃতি দেয় কি না (তবে তার কোড থেকে কিছুটা সরলীকৃত):

var ClientTZ = {
    UTCoffset:  0,          // Browser time offset from UTC in minutes
    UTCoffsetT: '+0000S',   // Browser time offset from UTC in '±hhmmD' form
    hasDST:     false,      // Browser time observes DST

    // Determine browser's timezone and DST
    getBrowserTZ: function () {
        var self = ClientTZ;

        // Determine UTC time offset
        var now = new Date();
        var date1 = new Date(now.getFullYear(), 1-1, 1, 0, 0, 0, 0);    // Jan
        var diff1 = -date1.getTimezoneOffset();
        self.UTCoffset = diff1;

        // Determine DST use
        var date2 = new Date(now.getFullYear(), 6-1, 1, 0, 0, 0, 0);    // Jun
        var diff2 = -date2.getTimezoneOffset();
        if (diff1 != diff2) {
            self.hasDST = true;
            if (diff1 - diff2 >= 0)
                self.UTCoffset = diff2;     // East of GMT
        }

        // Convert UTC offset to ±hhmmD form
        diff2 = (diff1 < 0 ? -diff1 : diff1) / 60;
        var hr = Math.floor(diff2);
        var min = diff2 - hr;
        diff2 = hr * 100 + min * 60;
        self.UTCoffsetT = (diff1 < 0 ? '-' : '+') + (hr < 10 ? '0' : '') + diff2.toString() + (self.hasDST ? 'D' : 'S');

        return self.UTCoffset;
    }
};

// Onload
ClientTZ.getBrowserTZ();

লোড করার পরে, ClientTZ.getBrowserTZ()ফাংশনটি কার্যকর করা হয়, যা সেট করে:

  • ClientTZ.UTCoffset ইউটিসি থেকে মিনিটের মধ্যে অফসেট ব্রাউজারে (উদাহরণস্বরূপ, সিএসটি −360 মিনিট, যা ইউটিসি থেকে −6.0 ঘন্টা);
  • ClientTZ.UTCoffsetTফর্মের অফসেটে '±hhmmD'(উদাহরণস্বরূপ '-0600D'), যেখানে প্রত্যয়টি Dডিএসটি এবং Sস্ট্যান্ডার্ড (নন-ডিএসটি) জন্য;
  • ClientTZ.hasDST (সত্য বা মিথ্যা)

ClientTZ.UTCoffsetপরিবর্তে ঘন্টার মিনিটের মধ্যে প্রদান করা কারণ কিছু সময়ের অঞ্চলগুলোকে ভগ্ন ঘনঘন অফসেট (যেমন, +0415) থাকতে হয়।

পিছনের উদ্দেশ্যটি ClientTZ.UTCoffsetTহ'ল ড্রপ-ডাউন <select>তালিকার মতো টাইমজোনগুলির টেবিলে (এখানে সরবরাহ করা হয়নি) কী হিসাবে ব্যবহার করা ।


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

@ ম্যাট - হ্যাঁ, আপনি 7-1জুনের পরিবর্তে জুলাইয়ের জন্য ব্যবহার করতে পারেন । আমি নিশ্চিত না যে এটি সত্যিই কোনও পার্থক্য করে কিনা, কারণ আমি সন্দেহ করি যে জুনে অন্তর্ভুক্ত নয় এমন আঞ্চলিক ডিএসটি স্কিম রয়েছে।
ডেভিড আর ট্রিবিবল

-13

কোন একক নির্ভরযোগ্য উপায় নেই এবং কখনও হবে না। আপনি কি সত্যিই ভেবেছিলেন আপনি ক্লায়েন্টকে বিশ্বাস করতে পারবেন?


23
স্পষ্ট করার জন্য: ক্লায়েন্টের ঘড়িটি সঠিকভাবে সেট না করা হতে পারে, অথবা তারা প্রকৃতপক্ষে কোনও আলাদা টাইম জোনে রয়েছেন এমন ভেবে ভ্রষ্টভাবে আপনাকে বোকা বানানোর চেষ্টা করছে। আপনি যদি ক্লায়েন্টের সময় অঞ্চলটি ব্যবহার করতে চলেছেন তবে কোনও গুরুত্বপূর্ণ কাজের জন্য এটি করবেন না।
রায়ান কিনাল

7
সম্ভাব্য বিভ্রান্তিমূলক উত্তর দেওয়ার জন্য এবং স্পষ্ট না করার জন্য -1
ডগ এস

6
হ্যাঁ, আমার আবেদনের জন্য আমি ক্লায়েন্টকে বিশ্বাস করতে পারি। যদি ক্লায়েন্টটি ভুল কনফিগার করা থাকে বা কোনও বাগ থাকে তবে তা আমার ব্যবহারকারীদের উপর।
মাইকেল কোল

3
আমি আসলে ফ্লোরিয়ার সাথে একমত। নির্ভরযোগ্য পদ্ধতি? ধরনের। নির্ভরযোগ্য ডেটা? অবশ্যই না।
রব

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