ক্লায়েন্ট ব্রাউজার থেকে একটি সময় অঞ্চল পেতে একটি নির্ভরযোগ্য উপায় আছে? আমি নীচের লিঙ্কগুলি দেখেছি তবে আমি আরও দৃust় সমাধান চাই।
ক্লায়েন্ট ব্রাউজার থেকে একটি সময় অঞ্চল পেতে একটি নির্ভরযোগ্য উপায় আছে? আমি নীচের লিঙ্কগুলি দেখেছি তবে আমি আরও দৃust় সমাধান চাই।
উত্তর:
এই সংগ্রহস্থল পৃষ্ঠাগুলি দেখুন এটি সহায়ক
jstz.min.js ডাউনলোড করুন এবং আপনার এইচটিএমএল পৃষ্ঠায় একটি ফাংশন যুক্ত করুন
<script language="javascript">
function getTimezoneName() {
timezone = jstz.determine()
return timezone.name();
}
</script>
এবং আপনার প্রদর্শন ট্যাগ থেকে এই ফাংশন কল
Intl.DateTimeFormat().resolvedOptions().timeZone
ওয়ালেসের পরামর্শ অনুসারে (কোনও আইই 11 নেই) ব্যবহার করতে পারি ।
আধ দশক পরে আমাদের এটির জন্য একটি অন্তর্নির্মিত উপায় আছে! আধুনিক ব্রাউজারগুলির জন্য আমি এটি ব্যবহার করব:
const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tz);
এটি আইএএনএ টাইমজোন স্ট্রিংটি প্রদান করে তবে অফসেট নয় । MDN রেফারেন্সে আরও জানুন ।
সামঞ্জস্যতা টেবিল - মার্চ 2019 পর্যন্ত, বিশ্বব্যাপী 90% ব্রাউজারগুলির ব্যবহারের জন্য কাজ করে। ইন্টারনেট এক্সপ্লোরারে কাজ করে না ।
Intl.DateTimeFormat().resolvedOptions().timeZone
->undefined
Intl.DateTimeFormat().resolvedOptions().timeZone
ফায়ারফক্স ৫২ থেকে শুরু হওয়া প্রত্যাশিত মানটি ফিরে আসবে: kangax.github.io/compat-table/esintl/…
প্রায়শই যখন লোকেরা "টাইমজোনগুলি" সন্ধান করেন, কেবলমাত্র "ইউটিসি অফসেট "ই যথেষ্ট হবে। উদাহরণস্বরূপ, তাদের সার্ভারটি ইউটিসি +5 এ রয়েছে এবং তারা জানতে চায় যে তাদের ক্লায়েন্টটি ইউটিসি -8 এ চলছে ।
সাধারণ পুরানো জাভাস্ক্রিপ্ট (new Date()).getTimezoneOffset()/60
ইউটিসি থেকে অফসেটের বর্তমান সংখ্যাটি ফিরিয়ে দেবে।
getTimezoneOffset()
রিটার্ন মান (এমডিএন ডক্স থেকে) এর সাইন ইন একটি সম্ভাব্য "গোটচা" লক্ষ করার মতো :
টাইম-জোন অফসেটটি ইউটিসি এবং স্থানীয় সময়ের মধ্যে কয়েক মিনিটের মধ্যে পার্থক্য। মনে রাখবেন যে এর অর্থ অফসেটটি ইতিবাচক যদি স্থানীয় সময় অঞ্চলটি ইউটিসির পিছনে থাকে এবং যদি এগিয়ে থাকে তবে এটি নেতিবাচক হয়। উদাহরণস্বরূপ, টাইম জোনের ইউটিসি + 10: 00 (অস্ট্রেলিয়ান পূর্ব স্ট্যান্ডার্ড সময়, ভ্লাদিভোস্টক সময়, চমোরো স্ট্যান্ডার্ড সময়), -600 ফিরে আসবে।
তবে, আমি আপনাকে সময় / তারিখ সম্পর্কিত জাভাস্ক্রিপ্ট কোডের জন্য day.js ব্যবহার করার পরামর্শ দিচ্ছি । কোন ক্ষেত্রে আপনি চালিয়ে একটি আইএসও 8601 ফর্ম্যাটযুক্ত ইউটিসি অফসেট পেতে পারেন:
> dayjs().format("Z")
"-08:00"
এটি সম্ভবত উল্লেখ করা যায় যে ক্লায়েন্ট সহজেই এই তথ্যটি মিথ্যা করতে পারে।
(দ্রষ্টব্য: এই উত্তরটি মূলত https://momentjs.com/ কে সুপারিশ করেছে , তবে ডেজেস আরও আধুনিক, আরও ছোট বিকল্প)
আপাতত, এমবায়েলুনের উত্তরে প্রস্তাবিত সর্বোত্তম বাজি সম্ভবত জেএসটিজেট ।
সম্পূর্ণতার জন্য, এটি উল্লেখ করা উচিত যে এটির পথে একটি মান আছে: ইনটেল । আপনি ইতিমধ্যে এটি ক্রোমে দেখতে পারেন:
> Intl.DateTimeFormat().resolvedOptions().timeZone
"America/Los_Angeles"
(এটি আসলে মানটিকে অনুসরণ করে না, যা গ্রন্থাগারের সাথে লেগে থাকার আরও একটি কারণ)
Intl
ফিরে আসার কথা । পরিবর্তে সিস্টেমের টাইমজোনটি ফিরিয়ে ক্রোম মান থেকে বিচ্যুত হয়; জোহানেসের উত্তর এটিই কাজে লাগিয়েছে, তবে কেন তিনি বলেছেন যে "আসলে মানটি অনুসরণ করে না"। undefined
timeZone
DateTimeFormat
টাইমজোনটি অনুমান করতে আপনি মুহূর্ত-সময় অঞ্চল ব্যবহার করতে পারেন :
> moment.tz.guess()
"America/Asuncion"
এখানে একটি jsfiddle আছে
এটি বর্তমান ব্যবহারকারীর টাইমজোনটির সংক্ষিপ্তসার সরবরাহ করে।
এখানে কোড নমুনা
var tz = jstz.determine();
console.log(tz.name());
console.log(moment.tz.zone(tz.name()).abbr(new Date().getTime()));
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()));
আমি জোশ ফ্রেজারের মতো নেওয়া মতামত ব্যবহার করেছি , যা ইউটিসি থেকে অফসেট ব্রাউজারের সময় নির্ধারণ করে এবং এটি ডিএসটিকে স্বীকৃতি দেয় কি না (তবে তার কোড থেকে কিছুটা সরলীকৃত):
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>
তালিকার মতো টাইমজোনগুলির টেবিলে (এখানে সরবরাহ করা হয়নি) কী হিসাবে ব্যবহার করা ।
7-1
জুনের পরিবর্তে জুলাইয়ের জন্য ব্যবহার করতে পারেন । আমি নিশ্চিত না যে এটি সত্যিই কোনও পার্থক্য করে কিনা, কারণ আমি সন্দেহ করি যে জুনে অন্তর্ভুক্ত নয় এমন আঞ্চলিক ডিএসটি স্কিম রয়েছে।
কোন একক নির্ভরযোগ্য উপায় নেই এবং কখনও হবে না। আপনি কি সত্যিই ভেবেছিলেন আপনি ক্লায়েন্টকে বিশ্বাস করতে পারবেন?