কীভাবে ব্যবহারকারীর সময় অঞ্চলকে উপেক্ষা করবেন এবং তারিখ () নির্দিষ্ট সময় অঞ্চলটি ব্যবহার করতে বাধ্য করবেন


104

একটি জেএস অ্যাপে, আমি 1270544790922সার্ভার (আজাক্স) থেকে টাইমস্ট্যাম্প (eq। ) পাই ।

এই টাইমস্ট্যাম্পের উপর ঝাঁকুনির Dateসাহায্যে আমি অবজেক্ট তৈরি করছি :

var _date = new Date();
_date.setTime(1270544790922);

এখন, _dateবর্তমান ব্যবহারকারী লোকালে সময় অঞ্চলে ডিকোডড টাইমস্ট্যাম্প। আমি এটা চাই না।

আমি _ _ dateএই টাইমস্ট্যাম্পটি ইউরোপের হেলসিঙ্কি শহরে বর্তমান ব্যবহারকারীর (বর্তমান সময়ের অঞ্চলটিকে উপেক্ষা করে) বর্তমান সময়ে রূপান্তর করতে চাই ।

আমি এটা কিভাবে করবো?


আমি জানি যে হেলসিঙ্কিতে টাইম জোনের অফসেট শীতে +2 এবং ডিএসটিতে +3 হয়। কিন্তু ডিএসটি কখন হয় কে জানে?
জেএসে

এটি সম্ভব, তবে জাভাস্ক্রিপ্টের স্থানীয় পদ্ধতিগুলি ব্যবহার না করে, কারণ জাভাস্ক্রিপ্টটির ব্যবহারকারীর সিস্টেমের বর্তমান টাইমজোনের তুলনায় অন্যান্য টাইমজোনের টাইমজোন স্থানান্তরের ইতিহাস নির্ধারণ করার কোনও পদ্ধতি নেই (এবং এটি ব্রাউজার নির্ভর যখন আমরা 80 এর তারিখগুলিতে যাই তখন নির্ভর করে)। তবে এইভাবে এটি সম্ভব: স্ট্যাকওভারফ্লো.com / a / 12814213 / 1691517 এবং আমি মনে করি যে আমার উত্তর আপনাকে সঠিক ফলাফল দেয়।
টিমো কাহকেনেন

উত্তর:


64

একটি তারিখ অবজেক্টের অন্তর্নিহিত মানটি ইউটিসি-তে থাকে। এই প্রমাণ করার জন্য যে লক্ষ্য যদি আপনি টাইপ new Date(0)তোমার মত কিছু দেখতে পাবেন: Wed Dec 31 1969 16:00:00 GMT-0800 (PST)। জিএমটিতে 0 হিসাবে 0 হিসাবে বিবেচিত হয়, তবে .toString()পদ্ধতিটি স্থানীয় সময় দেখায়।

বড় নোট, ইউটিসি মানে ইউনিভার্সাল টাইম কোড। এখনকার 2 টি আলাদা জায়গায় এখনকার সময় একই ইউটিসি, তবে আউটপুটটি আলাদাভাবে ফর্ম্যাট করা যায়।

আমাদের এখানে যা দরকার তা হ'ল কিছু বিন্যাস

var _date = new Date(1270544790922); 
// outputs > "Tue Apr 06 2010 02:06:30 GMT-0700 (PDT)", for me
_date.toLocaleString('fi-FI', { timeZone: 'Europe/Helsinki' });
// outputs > "6.4.2010 klo 12.06.30"
_date.toLocaleString('en-US', { timeZone: 'Europe/Helsinki' });
// outputs > "4/6/2010, 12:06:30 PM"

এটি কাজ করে কিন্তু .... আপনার উদ্দেশ্যগুলির জন্য আপনি অন্য তারিখের কোনও পদ্ধতি ব্যবহার করতে পারবেন না কারণ তারা ব্যবহারকারীর সময় অঞ্চল বর্ণনা করে। আপনি যা চান তা হেলসিঙ্কি টাইমজোন সম্পর্কিত একটি তারিখের অবজেক্ট। এই মুহুর্তে আপনার বিকল্পগুলি কয়েকটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করা হবে (আমি এটি প্রস্তাব করি), বা তারিখের অবজেক্টটি হ্যাক-আপ করুন যাতে আপনি এর বেশিরভাগ পদ্ধতি ব্যবহার করতে পারেন।

বিকল্প 1 - একটি তৃতীয় পক্ষ মুহুর্ত-সময় অঞ্চল হিসাবে

moment(1270544790922).tz('Europe/Helsinki').format('YYYY-MM-DD HH:mm:ss')
// outputs > 2010-04-06 12:06:30
moment(1270544790922).tz('Europe/Helsinki').hour()
// outputs > 12

আমরা পরবর্তী কি করতে যাচ্ছি তার থেকে এটি অনেক বেশি মার্জিত দেখাচ্ছে।

বিকল্প 2 - তারিখ অবজেক্টটি হ্যাক করুন

var currentHelsinkiHoursOffset = 2; // sometimes it is 3
var date = new Date(1270544790922);
var helsenkiOffset = currentHelsinkiHoursOffset*60*60000;
var userOffset = _date.getTimezoneOffset()*60000; // [min*60000 = ms]
var helsenkiTime = new Date(date.getTime()+ helsenkiOffset + userOffset);
// Outputs > Tue Apr 06 2010 12:06:30 GMT-0700 (PDT)

এটি এখনও এটি GMT-0700 (PDT) বলে মনে করে, তবে আপনি যদি খুব বেশি কঠোরভাবে না তাকান তবে আপনি ভুল করতে সক্ষম হতে পারেন যে কোনও তারিখের জন্য যা আপনার উদ্দেশ্যে কার্যকর।

আমি সুবিধামত একটি অংশ এড়ানো। আপনি সংজ্ঞা দিতে সক্ষম হতে হবে currentHelsinkiOffset। আপনি যদি date.getTimezoneOffset()সার্ভার সাইডে ব্যবহার করতে পারেন বা সময় অঞ্চল পরিবর্তন হওয়ার সময় বিবৃতি দেওয়ার জন্য কিছু ব্যবহার করুন তবে এটি আপনার সমস্যার সমাধান করবে।

উপসংহার - আমি মনে করি বিশেষত এই উদ্দেশ্যে আপনার মুহুর্ত-সময় অঞ্চল হিসাবে একটি তারিখ লাইব্রেরি ব্যবহার করা উচিত ।


এছাড়াও ... একটি লোকেশন থেকে জিএমটি অফসেট ব্যবহার করে একই ধরণের কাজ করা যেতে পারে। সেক্ষেত্রে আপনার জাভাস্ক্রিপ্টের দরকার নেই।
প্যারিস

দুঃখিত তবে না, আমি হুবহু বিপরীতটি বোঝায় :) আমি প্রশ্নটি সম্পাদনা করেছি, সম্ভবত এটি এখন আরও স্পষ্ট হবে
ওয়ার্পেক

ঠিক আছে আমি আমার সমাধান পরিবর্তন করেছি। আমি মনে করি এটিই আপনি খুঁজছেন।
প্যারিস

দুর্ভাগ্যক্রমে এটিই আমি এক সাথে এসেছি। আমি ভেবেছিলাম সম্ভবত ব্রাউজারটি আমার জন্য "_helsinkiOffset" উত্পন্ন করতে পারে।
ওয়ারপেক

2
আমি বিশ্বাস করি *60*60পরিবর্তে হওয়া উচিত *60000, যেহেতু গেটটাইমটি মিনি সেকেন্ডে এবং গেটটাইমোন অফসেটটি মিনিটের মধ্যে থাকে, যার মধ্যে এক মিনিটে 60000 মিলিসেকেন্ড থাকে, 60 * 60 == 3600
অ্যারোনলএস

20

মিলিসেকেন্ড এবং ব্যবহারকারীর সময় অঞ্চল হিসাবে অ্যাকাউন্ট করতে, নিম্নলিখিতটি ব্যবহার করুন:

var _userOffset = _date.getTimezoneOffset()*60*1000; // user's offset time
var _centralOffset = 6*60*60*1000; // 6 for central time - use whatever you need
_date = new Date(_date.getTime() - _userOffset + _centralOffset); // redefine variable

কেন্দ্রীয়ের জন্য একটি নির্ধারিত অফসেট ব্যবহার করে প্রতিস্থাপন করতে, আমি 00:00 এর একটি নির্দিষ্ট সময়ের সাথে সিএসটি ব্যবহার করে একটি তারিখ তৈরির ধারণাটি ব্যবহার করেছি, তারপরে সেই তারিখের গেট আউটস আওয়ার।
গ্র্যান্টপর্াক্স

+1 এটি আমার পক্ষে কাজ করেছে। মিলিসেকেন্ডে ডিল না করে 'উত্তর' কীভাবে কাজ করতে পারে তা নিশ্চিত নয়।
ক্রিস ওয়ালিস

2
@ এহরেন কি আপনাকে জিএমটিতে পেতে টাইমজোনঅফসেট যুক্ত না করে কেন্দ্রীয় অফসেটটি বিয়োগ করতে হবে?
কোডার

15

শুধু অন্য পদ্ধতির

function parseTimestamp(timestampStr) {
  return new Date(new Date(timestampStr).getTime() + (new Date(timestampStr).getTimezoneOffset() * 60 * 1000));
};

//Sun Jan 01 2017 12:00:00
var timestamp = 1483272000000;
date = parseTimestamp(timestamp);
document.write(date);

চিয়ার্স!


2
দিবালোক সংরক্ষণের সময়টির কারণে এটি অনিচ্ছাকৃত ফলাফল পেতে পারে। ক্লায়েন্ট যদি ডিএসটি ব্যবহার করে এমন সময় অঞ্চলে থাকে তবে পার্সিংয়ের ফলাফলটি এক ঘন্টার মধ্যে বন্ধ হয়ে যেতে পারে (কিছু অঞ্চল এক ঘন্টার ভগ্নাংশ ব্যবহার করে)। উদাহরণস্বরূপ: ব্যবহারকারী এনওয়াইতে রয়েছেন এবং আজ 4 জুলাই। এর অর্থ হল যে ব্যবহারকারী GMT -0400 এ রয়েছে (ডিএসটি লাথি মারার পর থেকে ইস্টার্ন ডাইটলাইট টাইমজোন); টাইমস্ট্যাম্পে পাস 30 শে জানুয়ারীর জন্য, যা GMT-0500 (পূর্ব স্ট্যান্ডার্ড টাইমজোন - বছরের কোনও সময় ডিএসটি নেই)। ফলাফলটি এক ঘন্টা বন্ধ থাকবে, কারণ গেটটাইমজোনঅফসেট () আপনাকে এখন অফসেট দেয়, জানুয়ারীতে যা ছিল তা নয়।
দিমিতর দারাঝাঁস্কি

2
এই সমস্যাটি সমাধানের জন্য, আপনি যে তারিখেnew Date().getTimezoneOffset()new Date(timestampStr).getTimezoneOffset()
যাচ্ছেন তার সময়সীমার অফसेट

13

আমার সন্দেহ আছে যে উত্তরটি সঠিক ফলাফল দেয় না। প্রশ্নটিতে প্রশ্নকর্তা হেলসিঙ্কিতে ব্যবহারকারীর বর্তমান সময় অঞ্চলটিকে উপেক্ষা করে টাইমস্ট্যাম্পটি সার্ভার থেকে বর্তমান সময়ে রূপান্তর করতে চান।

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

যদি উদা। টাইমস্ট্যাম্পটি 1270544790922 এবং আমাদের একটি ফাংশন রয়েছে:

var _date = new Date();
_date.setTime(1270544790922);
var _helsenkiOffset = 2*60*60;//maybe 3
var _userOffset = _date.getTimezoneOffset()*60*60; 
var _helsenkiTime = new Date(_date.getTime()+_helsenkiOffset+_userOffset);

যখন নিউইয়র্কার পৃষ্ঠাটি দেখেন, সতর্কতা (_হেলসেনকিটাইম) মুদ্রণ:

Tue Apr 06 2010 05:21:02 GMT-0400 (EDT)

এবং যখন কোনও ফিনল্যান্ডার পৃষ্ঠাটি দেখেন, সতর্কতা (_হেলসেনকিটাইম) প্রিন্টগুলি:

Tue Apr 06 2010 11:55:50 GMT+0300 (EEST)

সুতরাং কেবলমাত্র পৃষ্ঠা দর্শকের কম্পিউটারে লক্ষ্য টাইমজোন (ইউরোপ / হেলসিঙ্কি) থাকলে ফাংশনটি সঠিক, তবে বিশ্বের প্রায় প্রতিটি অঞ্চলে ব্যর্থ হয়। এবং সার্ভারের টাইমস্ট্যাম্পটি সাধারণত ইউনিক্স টাইমস্ট্যাম্প যা ইউটিসি-র সংজ্ঞা অনুসারে হয়, ইউনিক্স ইপচ (জানুয়ারী 1 1970 00:00:00 GMT) এর পরে সেকেন্ডের সংখ্যা, আমরা টাইমস্ট্যাম্প থেকে ডিএসটি বা নন-ডিএসটি নির্ধারণ করতে পারি না।

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

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

ইউরোপ / হেলসিঙ্কিতে 1998 - 2099 সালের তারিখগুলি কভার করার জন্য আপনি নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন ( jsfiddled ):

function timestampToHellsinki(server_timestamp) {
    function pad(num) {
        num = num.toString();
        if (num.length == 1) return "0" + num;
        return num;
    }

    var _date = new Date();
    _date.setTime(server_timestamp);

    var _year = _date.getUTCFullYear();

    // Return false, if DST rules have been different than nowadays:
    if (_year<=1998 && _year>2099) return false;

    // Calculate DST start day, it is the last sunday of March
    var start_day = (31 - ((((5 * _year) / 4) + 4) % 7));
    var SUMMER_start = new Date(Date.UTC(_year, 2, start_day, 1, 0, 0));

    // Calculate DST end day, it is the last sunday of October
    var end_day = (31 - ((((5 * _year) / 4) + 1) % 7))
    var SUMMER_end = new Date(Date.UTC(_year, 9, end_day, 1, 0, 0));

    // Check if the time is between SUMMER_start and SUMMER_end
    // If the time is in summer, the offset is 2 hours
    // else offset is 3 hours
    var hellsinkiOffset = 2 * 60 * 60 * 1000;
    if (_date > SUMMER_start && _date < SUMMER_end) hellsinkiOffset = 
    3 * 60 * 60 * 1000;

    // Add server timestamp to midnight January 1, 1970
    // Add Hellsinki offset to that
    _date.setTime(server_timestamp + hellsinkiOffset);
    var hellsinkiTime = pad(_date.getUTCDate()) + "." + 
    pad(_date.getUTCMonth()) + "." + _date.getUTCFullYear() + 
    " " + pad(_date.getUTCHours()) + ":" +
    pad(_date.getUTCMinutes()) + ":" + pad(_date.getUTCSeconds());

    return hellsinkiTime;
}

ব্যবহারের উদাহরণ:

var server_timestamp = 1270544790922;
document.getElementById("time").innerHTML = "The timestamp " + 
server_timestamp + " is in Hellsinki " + 
timestampToHellsinki(server_timestamp);

server_timestamp = 1349841923 * 1000;
document.getElementById("time").innerHTML += "<br><br>The timestamp " + 
server_timestamp + " is in Hellsinki " + timestampToHellsinki(server_timestamp);

var now = new Date();
server_timestamp = now.getTime();
document.getElementById("time").innerHTML += "<br><br>The timestamp is now " +
server_timestamp + " and the current local time in Hellsinki is " +
timestampToHellsinki(server_timestamp);​

এবং এটি ব্যবহারকারী টাইমজোন নির্বিশেষে নিম্নলিখিত মুদ্রণ:

The timestamp 1270544790922 is in Hellsinki 06.03.2010 12:06:30

The timestamp 1349841923000 is in Hellsinki 10.09.2012 07:05:23

The timestamp is now 1349853751034 and the current local time in Hellsinki is 10.09.2012 10:22:31

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


2
বিশেষ দ্রষ্টব্য। হেলসিঙ্কিতে কেবল একটি 'এল' রয়েছে। এই ভুলটি সত্যই এই উত্তরটি থেকে সরিয়ে দেয়।
বেন

@ বেনএমসিআইন্টির এটি কিছুটা রসিকতা। বা এমন একটি হওয়ার কথা। :)
টিমো কাহকেনেন

আহ্, আপনার নিজের সময় / সময় অঞ্চল বাস্তবায়নের জন্য কখনও কোড দিন না ... তবে আমি -১
এমবি

3

হেলসিঙ্কির সময়ে আপনি টাইমস্ট্যাম্প পেয়েছেন বলে মনে করে, আমি 1 জানুয়ারী 1 1970 ইউটিসি (ব্রাউজারের স্থানীয় সময় অঞ্চল সেটিংস উপেক্ষা করার জন্য) মধ্যরাতে সেট করে একটি তারিখ অবজেক্ট তৈরি করব। তারপরে এটিতে প্রয়োজনীয় সংখ্যক মিলিসেকেন্ড যুক্ত করুন।

var _date	= new Date( Date.UTC(1970, 0, 1, 0, 0, 0, 0) );
_date.setUTCMilliseconds(1270544790922);

alert(_date); //date shown shifted corresponding to local time settings
alert(_date.getUTCFullYear());    //the UTC year value
alert(_date.getUTCMonth());       //the UTC month value
alert(_date.getUTCDate());        //the UTC day of month value
alert(_date.getUTCHours());       //the UTC hour value
alert(_date.getUTCMinutes());     //the UTC minutes value

তারিখ অবজেক্ট থেকে সর্বদা ইউটিসি মান জিজ্ঞাসা করার জন্য পরে দেখুন। স্থানীয় সেটিংস নির্বিশেষে ব্যবহারকারীরা একই তারিখের মানগুলি দেখতে পাবেন। অন্যথায় তারিখের মানগুলি স্থানীয় সময়ের সেটিংসের সাথে সঞ্চারিত হবে।


0

আপনি ব্যবহার করতে পারেন setUTCMilliseconds()

var _date = new Date();
_date.setUTCMilliseconds(1270544790922);

এই উত্তরটি ভুল। সেটআউটসিমিলিসেকেন্ডগুলি তারিখে নির্দিষ্ট মিলিসেকেন্ডগুলির সংখ্যা যুক্ত করে।
টিবোর

@ টিবোর: মোজদেব থেকে: setUTCMilliseconds()পদ্ধতিটি সর্বজনীন সময় অনুযায়ী একটি নির্দিষ্ট তারিখের জন্য মিলিসেকেন্ডগুলি সেট করে। [...] আপনার নির্দিষ্ট করা প্যারামিটার যদি প্রত্যাশিত ব্যাপ্তির বাইরে থাকে তবে setUTCMilliseconds()সেই অনুযায়ী তারিখের অবজেক্টে তারিখের তথ্য আপডেট করার চেষ্টা করুন। অন্য কথায়, আপনি Dateইউটিসি-তে প্রদত্ত ইউনিক্স টাইমস্ট্যাম্পযুক্ত একটি বস্তু তৈরি করেন।
jimasun

ডাব্লু 3 স্কুল থেকে: সেটআপসিমিলিসেকেন্ডস () পদ্ধতিটি সর্বজনীন সময় অনুসারে মিলিসেকেন্ডগুলি (0 থেকে 999 পর্যন্ত) সেট করে। উপরের উত্তরটি চেষ্টা করে দেখুন এবং নিজের জন্য দেখুন।
টিবোর

এমডিএন থেকে: প্যারামিটারগুলি মিলি সেকেন্ডস ভ্যালু: 0 থেকে 999 এর মধ্যে একটি সংখ্যা, মিলিসেকেন্ডগুলির প্রতিনিধিত্ব করে ...
টিবোর

আপনার উদাহরণটি প্রত্যাশার মতো কাজ করে না, কারণ নতুন তারিখ () বর্তমান স্থানীয় তারিখের সাথে একটি তারিখ অবজেক্ট তৈরি করে। এবং এর পরে এটি নির্দিষ্ট করা মিলিসেকেন্ডগুলির সংখ্যা যুক্ত করে। সুতরাং আপনার উদাহরণে যদি বর্তমান স্থানীয় তারিখটি 2017-05-04 হয় তবে ফলাফলের তারিখ 4027 সালের পরে কোথাও হবে ...
টিবোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.