কোনও নির্দিষ্ট টাইম জোনে জাভাস্ক্রিপ্টের তারিখ কীভাবে শুরু করতে হয়


232

স্ট্রিং হিসাবে আমার একটি নির্দিষ্ট টাইম জোনে তারিখের সময় আছে এবং আমি এটি স্থানীয় সময়ে রূপান্তর করতে চাই। তবে, ডেট অবজেক্টে টাইমজোন কীভাবে সেট করবেন তা আমি জানি না।

উদাহরণস্বরূপ, আমি Feb 28 2013 7:00 PM ET,তারপর আমি করতে পারেন

var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);  

আমি যতদূর জানি, আমি হয় ইউটিসি সময় বা স্থানীয় সময় নির্ধারণ করতে পারি। তবে, আমি কীভাবে অন্য টাইমজোনটিতে সময় নির্ধারণ করব?

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

আমি কীভাবে জাভাস্ক্রিপ্টে আলাদা সময় অঞ্চল থেকে স্থানীয় সময় রূপান্তর করতে পারি?



1
তারিখের অবজেক্টগুলির একটি সময় অঞ্চল নেই, তারা ইউটিসি।
রবজি

উত্তর:


349

পটভূমি

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

লিপের সেকেন্ড বিবেচনা না করে কোনও Dateঅবজেক্টের অভ্যন্তরীণ উপস্থাপনা হ'ল একক সংখ্যা, যা মিলি সেকেন্ডের সময়কে ছাড়িয়ে গেছে 1970-01-01 00:00:00 UTCতারিখ অবজেক্টে নিজেই কোনও টাইম জোন বা স্ট্রিং ফর্ম্যাট নেই। যখন Dateবস্তুর বিভিন্ন ফাংশন ব্যবহার করা হয়, কম্পিউটারের স্থানীয় সময় অঞ্চলটি অভ্যন্তরীণ উপস্থাপনায় প্রয়োগ করা হয়। যদি ফাংশনটি একটি স্ট্রিং উত্পাদন করে, তবে সেই স্ট্রিংটি কীভাবে উত্পাদন করা যায় তা নির্ধারণের জন্য কম্পিউটারের লোকাল তথ্য বিবেচনা করা যেতে পারে। বিবরণ ফাংশন অনুযায়ী পৃথক, এবং কিছু বাস্তবায়ন-নির্দিষ্ট।

Dateঅ-স্থানীয় সময় অঞ্চলগুলির সাথে অবজেক্টটি কেবলমাত্র কাজ করতে পারে:

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

    var d = new Date("2020-04-13T00:00:00.000+08:00");
    d.toISOString()  //=> "2020-04-12T16:00:00.000Z"
    d.valueOf()      //=> 1586707200000  (this is what is actually stored in the object)
    
  • ECMASCript Internationalization API (ওরফে "ইন্টেল") প্রয়োগ করা পরিবেশে , কোনও Dateবস্তু একটি নির্দিষ্ট সময় অঞ্চল শনাক্তকারীকে সমন্বিত একটি লোকেল-নির্দিষ্ট স্ট্রিং তৈরি করতে পারে। এটি timeZoneবিকল্প toLocaleStringএবং এর বিভিন্নতার মাধ্যমে সম্পন্ন হয় । বেশিরভাগ বাস্তবায়ন আইএএনএ টাইম জোন সনাক্তকারীকে সমর্থন করবে 'America/New_York'। উদাহরণ স্বরূপ:

    var d = new Date("2020-04-13T00:00:00.000+08:00");
    d.toLocaleString('en-US', { timeZone: 'America/New_York' })
    //=> "4/12/2020, 12:00:00 PM"
    // (midnight in China on Apring 13th is noon in New York on April 12th)
    

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

লাইব্রেরি

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

এখানে গ্রন্থাগারগুলি বিবেচনা করার জন্য রয়েছে:

অন্তর্নিহিত গ্রন্থাগারসমূহ

নতুন বিকাশের জন্য এই বাস্তবায়নগুলির মধ্যে একটি বেছে নেওয়া উচিত, যা তাদের সময় অঞ্চল ডেটার জন্য ইন্টেল এপিআইয়ের উপর নির্ভর করে:

নন-ইন্টেল গ্রন্থাগারগুলি

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

* যদিও মোমেন্ট এবং মোমেন্ট-টাইমজোন আগে সুপারিশ করা হয়েছিল, মোমেন্ট টিম এখন ব্যবহারকারীদের নতুন বিকাশের জন্য লাক্সনকে পছন্দ করে।

বন্ধ লাইব্রেরি

এই গ্রন্থাগারগুলি আনুষ্ঠানিকভাবে বন্ধ হয়ে গেছে এবং আর ব্যবহার করা উচিত নয়।

ভবিষ্যতের প্রস্তাব

TC39 টেম্পোরাল প্রস্তাবনা লক্ষ্য জাভাস্ক্রিপ্ট ভাষা নিজেই তারিখ ও সময় সঙ্গে কাজ করার জন্য মান বস্তুর একটি নতুন সেট প্রদান। এটিতে সময় অঞ্চল সচেতন বস্তুর সমর্থন অন্তর্ভুক্ত থাকবে।


1
দয়া করে "প্রতিনিধিত্ব" কে "আউটপুট / পার্সে" পরিবর্তন করুন, যেহেতু উপস্থাপিত টাইমস্ট্যাম্পগুলি টাইমজোন-স্বতন্ত্র
বার্গি

1
@ বার্গি - আমি এটি নিয়ে পুনরায় চিন্তাভাবনা করেছি এবং আপনার সাথে একমত হয়েছি। সেই অনুসারে আমার উত্তর আপডেট করুন।
ম্যাট জনসন-পিন্ট

1
আপনি যখন ফায়ারবগ কনসোলে এটি করেন:, var date_time = new Date()এর মান date_time(আমার জন্য এইএসটিতে) Date {Sun Aug 21 2016 22:18:47 GMT+1000 (AEST)}এবং তাই এটি মনে হয় এটি একটি সময় অঞ্চল সংরক্ষণ করেছেdate_timeকোনও টাইমজোন অন্তর্ভুক্ত না করে আমি কীভাবে খালি ইউটিসি সময় নিশ্চিত করতে পারি ?
ব্যবহারকারীর 1063287

হুম, এই উত্তর (অনুযায়ী stackoverflow.com/a/8047885/1063287 :), এটা এই হল new Date().getTime();
user1063287

1
@ user1063287- toString পদ্ধতি হোস্ট সময় অঞ্চল "স্থানীয়" সময় অঞ্চলে একটি তারিখ ও সময় উত্পাদন করতে অফসেট ব্যবহার করে। তারিখ অবজেক্টের নিজেই একটি সময় মূল্য থাকে যা 1970-01-01T00: 00: 00Z থেকে অফসেট, তাই কার্যকরভাবে ইউটিসি। ইউটিসির তারিখ এবং সময় দেখতে, আইসএসটিস্ট্রিং ব্যবহার করুন ।
রবিজি

68

যেমনটি ম্যাট জনসন ড

আপনি যদি আধুনিক ওয়েব ব্রাউজারগুলিতে নিজের ব্যবহার সীমাবদ্ধ করতে পারেন তবে আপনি এখন কোনও বিশেষ গ্রন্থাগার ছাড়াই নিম্নলিখিতটি করতে পারেন:

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})

এটি কোনও বিস্তৃত সমাধান নয়, তবে এটি এমন অনেক পরিস্থিতিতে কাজ করে যা কেবলমাত্র আউটপুট রূপান্তর প্রয়োজন (ইউটিসি বা স্থানীয় সময় থেকে নির্দিষ্ট সময় অঞ্চলে, তবে অন্য দিকের নয়)।

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

function changeTimezone(date, ianatz) {

  // suppose the date is 12:00 UTC
  var invdate = new Date(date.toLocaleString('en-US', {
    timeZone: ianatz
  }));

  // then invdate will be 07:00 in Toronto
  // and the diff is 5 hours
  var diff = date.getTime() - invdate.getTime();

  // so 12:00 in Toronto is 17:00 UTC
  return new Date(date.getTime() + diff);

}

// E.g.
var there = new Date();
var here = changeTimezone(there, "America/Toronto");

console.log(`Here: ${here.toString()}\nToronto: ${there.toString()}`);


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

2
@ ব্লজিডেলিক এটি একটি নতুন পোস্ট। সত্যি কথা বলতে, আমি নিজেকে বিস্মিত করেছিলাম যখন এটি আমাকে আঘাত করেছিল আপনি toLocaleStringবিপরীত প্রভাব অর্জন করতে ব্যবহার করতে পারেন , এবং হ্যাঁ, এটি সাধারণ জ্ঞান হওয়া উচিত! এ সম্পর্কে একটি নিবন্ধ লিখুন এবং আমাকে উল্লেখ করুন :-)
14:46 এ সাধারণ পাইপ

1
নোডের পরিবেশের জন্য যা ইতিমধ্যে GMT তে নেই, উপরের কোডটি var invdate = নতুন তারিখ (তারিখ.টলোক্যালস্ট্রিং ('এন-মার্কিন', {টাইমজোন: ianatz})) থেকে পরিবর্তন করা উচিত; in var invdate = new তারিখ ($ {তারিখ.toLocaleString ('en-US', {timeZone: ianatz})} GMT`);
মাইক পি।

5
ToLocaleString এর আউটপুট পার্স করার জন্য ব্রাউজারগুলির প্রয়োজন হয় না , সুতরাং এটি একটি ত্রুটিযুক্ত ভিত্তির উপর ভিত্তি করে।
রবজি

3
"... এই উত্তরটি কেন বেশি ভালবাসা পাচ্ছে না?" - কারণ যে Dateবস্তুটি এটি প্রত্যাবর্তন করে তা মিথ্যা। এমনকি প্রদর্শিত উদাহরণটিও, স্ট্রিং আউটপুটে স্থানীয় মেশিনের সময় অঞ্চল অন্তর্ভুক্ত। আমার কম্পিউটারে, উভয় ফলাফলই "GMT-0700 (প্যাসিফিক দিবালোক সময়)" বলে, যেখানে এটি কেবল প্রথমটির জন্য সঠিক (টরন্টো আসলে পূর্ব সময়)) কেবল স্ট্রিং আউটপুট ছাড়াই, Dateঅবজেক্টের মধ্যে থাকা টাইমস্ট্যাম্পটি করা হয়েছে সময় মত একটি ভিন্ন পয়েন্ট এ স্থানান্তরিত। এই করতে একটি দরকারী কৌশল, কিন্তু আদেশ সহকারে অনেক সঙ্গে আসে - প্রাথমিকভাবে যে Dateবস্তুর ফাংশন স্বাভাবিক আউটপুট থাকবে না।
ম্যাট জনসন-পিন্ট

30

আপনি অফসেট টাইম জোনটি নির্দিষ্ট করতে পারেন new Date(), উদাহরণস্বরূপ:

new Date('Feb 28 2013 19:00:00 EST')

অথবা

new Date('Feb 28 2013 19:00:00 GMT-0500')

যেহেতু Dateইউটিসি সময় সংরক্ষণ করুন (যেমন getTimeইউটিসিতে ফিরে আসে), জাভাস্ক্রিপ্ট তাদের সময়কে ইউটিসিতে রূপান্তরিত করবে এবং আপনি যখন toStringজাভাস্ক্রিপ্টের মতো জিনিসগুলি কল করবেন তখন ইউটিসি সময়টিকে ব্রাউজারের স্থানীয় সময় অঞ্চলে রূপান্তরিত করবে এবং স্থানীয় সময় অঞ্চলটিতে স্ট্রিংটি ফিরে আসবে, যদি আমি ব্যবহার করি তবে UTC+8:

> new Date('Feb 28 2013 19:00:00 GMT-0500').toString()
< "Fri Mar 01 2013 08:00:00 GMT+0800 (CST)"

এছাড়াও আপনি সাধারণ getHours/Minute/Secondপদ্ধতি ব্যবহার করতে পারেন :

> new Date('Feb 28 2013 19:00:00 GMT-0500').getHours()
< 8

(এর 8অর্থ সময়টি আমার স্থানীয় সময়ে রূপান্তরিত হওয়ার পরে - UTC+8ঘন্টাগুলির সংখ্যা number 8)


16
আইএসও 8601 এক্সটেন্ডেড ফর্ম্যাট ব্যতীত অন্য কোনও ফর্ম্যাটকে পার্সিং করা বাস্তবায়ন নির্ভর এবং এর উপর নির্ভর করা উচিত নয়। টাইমজোন সংক্ষেপণের জন্য এখানে কোনও স্ট্যান্ডার্ড নেই, যেমন "EST" 3 টি বিভিন্ন জোনের যে কোনও একটিকে প্রতিনিধিত্ব করতে পারে।
রবজি

1
এই মন্তব্যের উদাহরণগুলি প্রায়শই ইন্টারনেট এক্সপ্লোরারে কাজ করে না। এই পোস্টে পূর্ববর্তী মন্তব্যে যেমন উল্লেখ করা হয়েছে, আইএসও 8601 গুরুত্বপূর্ণ। আমি ECMA-262 (জাভাস্ক্রিপ্ট 5 ম) সংস্করণ ভাষা স্পেসিফিকেশন পড়ে নিশ্চিত করেছি।
ডাকসান

12

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

dateWithTimeZone = (timeZone, year, month, day, hour, minute, second) => {
  let date = new Date(Date.UTC(year, month, day, hour, minute, second));

  let utcDate = new Date(date.toLocaleString('en-US', { timeZone: "UTC" }));
  let tzDate = new Date(date.toLocaleString('en-US', { timeZone: timeZone }));
  let offset = utcDate.getTime() - tzDate.getTime();

  date.setTime( date.getTime() + offset );

  return date;
};

সময় অঞ্চল এবং স্থানীয় সময় দিয়ে কীভাবে ব্যবহার করবেন:

dateWithTimeZone("America/Los_Angeles",2019,8,8,0,0,0)

এই সমাধানটি আমার প্রয়োজনের জন্য উপযুক্ত ছিল। আমি কীভাবে দিবালোক সংরক্ষণের জন্য হিসাব করতে পারি তা নিশ্চিত ছিলাম না।
হোসেইন আমিন

কেন শুধু tzDateসরাসরি ফিরে আসবেন না?
লেবি

8

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

var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);

// ET timezone offset in hours.
var timezone = -5;
// Timezone offset in minutes + the desired offset in minutes, converted to ms.
// This offset should be the same for ALL date calculations, so you should only need to calculate it once.
var offset = (mydate.getTimezoneOffset() + (timezone * 60)) * 60 * 1000;

// Use the timestamp and offset as necessary to calculate min/sec etc, i.e. for countdowns.
var timestamp = mydate.getTime() + offset,
    seconds = Math.floor(timestamp / 1000) % 60,
    minutes = Math.floor(timestamp / 1000 / 60) % 60,
    hours   = Math.floor(timestamp / 1000 / 60 / 60);

// Or update the timestamp to reflect the timezone offset.
mydate.setTime(mydate.getTime() + offset);
// Then Output dates and times using the normal methods.
var date = mydate.getDate(),
    hour = mydate.getHours();

সম্পাদনা

আমি আগে UTCতারিখের রূপান্তরগুলি সম্পাদন করার সময় পদ্ধতিগুলি ব্যবহার করছিলাম যা ভুল ছিল। সময়ের সাথে অফসেট যুক্ত করার সাথে সাথে স্থানীয় getফাংশনগুলি ব্যবহার করে কাঙ্ক্ষিত ফলাফলগুলি ফিরে আসবে।


আপনি কোথায় গণনা করেছেন timezone_offset?
আনন্দ সোমানী

1
ওহো, আমি আমার একটি ভেরিয়েবল ভুলবিভক্ত করেছি। বা ভিসার বিপরীতে timezone_offsetহওয়া উচিত ছিল offset। সঠিক পরিবর্তনশীল নামটি দেখানোর জন্য আমি আমার উত্তর সম্পাদনা করেছি।
শন ককারিল

3

আমি ইউনিট টেস্টগুলির সাথে একই ধরণের সমস্যায় পড়েছি (বিশেষত ঠাট্টায় যখন ইউনিট পরীক্ষাগুলি স্ন্যাপশট তৈরি করতে স্থানীয়ভাবে চালিত হয় এবং তারপরে সিআই সার্ভার একটি পৃথক টাইমজোন চালায় (সম্ভাব্যভাবে) স্ন্যাপশটের তুলনা ব্যর্থ হওয়ার কারণ হয়)। আমি আমাদের Dateএবং এই জাতীয় কিছু সহায়ক পদ্ধতি উপহাস করেছি:

describe('...', () => {
  let originalDate;

  beforeEach(() => {
    originalDate = Date;
    Date = jest.fn(
      (d) => {
        let newD;
        if (d) {
          newD = (new originalDate(d));
        } else {
          newD = (new originalDate('2017-05-29T10:00:00z'));
        }
        newD.toLocaleString = () => {
          return (new originalDate(newD.valueOf())).toLocaleString("en-US", {timeZone: "America/New_York"});
        };
        newD.toLocaleDateString = () => {
          return (new originalDate(newD.valueOf())).toLocaleDateString("en-US", {timeZone: "America/New_York"});
        };
        newD.toLocaleTimeString = () => {
          return (new originalDate(newD.valueOf())).toLocaleTimeString("en-US", {timeZone: "America/New_York"});
        };
        return newD;
      }
    );
    Date.now = () => { return (Date()); };
  });

  afterEach(() => {
    Date = originalDate;
  });

});

2

এনপিএম থেকে সিটিওসি ব্যবহার করার চেষ্টা করুন। https://www.npmjs.com/package/ctoc_timezone

এটি টাইমজোনগুলি (প্রায় 400 টি প্রায় সময় অঞ্চল) পরিবর্তন করার জন্য সহজ কার্যকারিতা পেয়েছে এবং আপনি যে কাস্টম ফর্ম্যাটগুলি প্রদর্শন করতে চান এটির জন্য এটি কার্যকর রয়েছে।


2

উপরের উত্তরের ভিত্তিতে লম্বা সময় অঞ্চল স্ট্রিংকে তিনটি বর্ণের স্ট্রিংয়ে রূপান্তর করতে আমি এই নেটিভ ওয়ান লাইনারটি ব্যবহার করছি:

var longTz = 'America/Los_Angeles';
var shortTz = new Date().
    toLocaleString("en", {timeZoneName: "short", timeZone: longTz}).
    split(' ').
    pop();

এটি প্রদত্ত তারিখের উপর নির্ভর করে পিডিটি বা পিএসটি দেবে। আমার বিশেষ ব্যবহারের ক্ষেত্রে, সেলসফোর্সে (আউরা / বিদ্যুৎ) উপর বিকাশ করে আমরা ব্যাকএন্ড থেকে লম্বা ফর্ম্যাটে ব্যবহারকারী টাইমজোনটি পেতে সক্ষম হয়েছি।


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

হাহা, আপনাকে একাধিক উত্তরের মন্তব্যটি এখানে পোস্ট করতে হবে: পি
শেন

2

আমি এর 3 বছর অনেক দেরিতে জানি, তবে সম্ভবত এটি অন্য কাউকে সাহায্য করতে পারে কারণ মুহূর্তের সময় অঞ্চল লাইব্রেরি ছাড়া আমি এর মতো কিছুই পাইনি, যা তিনি এখানে যা চেয়েছিলেন ঠিক তার মতো নয়।

আমি জার্মান টাইমজোনগুলির জন্য অনুরূপ কিছু করেছি, দিবালোকের সময় সাশ্রয় করার সময় এবং লিপ বছর যেখানে আপনার 366 দিন রয়েছে সে কারণে এটি কিছুটা জটিল।

"আইডালাইটস্যাভিংটাইমইনগারম্যানি" ফাংশনটির সাথে এটির জন্য সামান্য কাজ প্রয়োজন হতে পারে যখন দিবালোক সংরক্ষণের সময় বিভিন্ন সময়গুলিতে বিভিন্ন সময় পরিবর্তন হয়।

যাইহোক, এই পৃষ্ঠাটি দেখুন: https://github.com/zerkotin/german-timezone-converter/wiki

প্রধান পদ্ধতিগুলি হ'ল: রূপান্তরকেন্দ্রডিটোটো টার্মিন টাইমজোন রূপান্তরকারম্যানডেট টো লোকাল টাইমজোন

আমি এটি নথিভুক্ত করার চেষ্টা করেছি, সুতরাং এটি এত বিভ্রান্তিকর হবে না।


এটি একটি মন্তব্য হওয়া উচিত, এটি কোনও উত্তর নয়।
রবজি

1

চেষ্টা করুন: তারিখ থেকে সময় অঞ্চল , এটি স্থানীয়ভাবে উপলভ্য সাহায্যের সাথে প্রত্যাশিত তারিখটি সমাধান করে Intl.DateTimeFormat

আমি ইতিমধ্যে কয়েক বছর ধরে আমার একটি প্রকল্পে এই পদ্ধতিটি ব্যবহার করেছি, তবে এটি এখন ছোট ওএস প্রকল্প হিসাবে প্রকাশের সিদ্ধান্ত নিয়েছি :)


0

আয়নিক ব্যবহারকারীদের জন্য, আমি এটি দিয়ে নরক পেয়েছি কারণ .toISOString()এইচটিএমএল টেমপ্লেটটি ব্যবহার করতে হবে।

এটি বর্তমান তারিখটি দখল করবে তবে অবশ্যই একটি নির্বাচিত তারিখের জন্য পূর্ববর্তী উত্তরে যুক্ত করা যেতে পারে।

আমি এটি ব্যবহার করে এটি ঠিক করেছি:

date = new Date();
public currentDate: any = new Date(this.date.getTime() - this.date.getTimezoneOffset()*60000).toISOString();

* 60000 ইউটিসি -6 নির্দেশ করছে যা সিএসটি তাই টাইমজোন যা প্রয়োজন, সংখ্যা এবং পার্থক্য পরিবর্তন করা যেতে পারে।


প্রশ্নকর্তা এটির উত্তর নয়। তিনি নির্দিষ্ট সময় অঞ্চলে তারিখটি পেতে চেয়েছিলেন।
রিচার্ড ভার্জিস

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

0

হয়তো এই আপনাকে সাহায্য করবে

/**
 * Shift any Date timezone.
 * @param {Date} date - Date to update.
 * @param {string} timezone - Timezone as `-03:00`.
 */
function timezoneShifter(date, timezone) {
  let isBehindGTM = false;
  if (timezone.startsWith("-")) {
    timezone = timezone.substr(1);
    isBehindGTM = true;
  }

  const [hDiff, mDiff] = timezone.split(":").map((t) => parseInt(t));
  const diff = hDiff * 60 + mDiff * (isBehindGTM ? 1 : -1);
  const currentDiff = new Date().getTimezoneOffset();

  return new Date(date.valueOf() + (currentDiff - diff) * 60 * 1000);
}



const _now = new Date()
console.log(
  [
    "Here: " + _now.toLocaleString(),
    "Greenwich: " + timezoneShifter(_now, "00:00").toLocaleString(),
    "New York: " + timezoneShifter(_now, "-04:00").toLocaleString(),
    "Tokyo: " + timezoneShifter(_now, "+09:00").toLocaleString(),
    "Buenos Aires: " + timezoneShifter(_now, "-03:00").toLocaleString(),
  ].join('\n')
);


-2

একই সমস্যার মুখোমুখি হয়েছিলেন, এটি ব্যবহার করেছেন

কনসোল.লগ (তারিখ.পার্স ("জুন 13, 2018 10:50:39 GMT + 1"));

এটি মিলিসেকেন্ডগুলিতে ফিরে আসবে যেখানে আপনি +100 টিমজোনটি ব্রিটিশ সময়কে অন্তর্নিহিত করতে পারবেন তা আশা করি !!


3
(এই পোস্টটি প্রশ্নের কোনও মানের উত্তর দেয় বলে মনে হচ্ছে না Please দয়া করে হয় আপনার উত্তরটি সম্পাদনা করুন, অথবা কেবলমাত্র প্রশ্নের মন্তব্য হিসাবে এটি পোস্ট করুন)।
সুনুন ןɐ কিউপি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.