কীভাবে জাভাস্ক্রিপ্টে টাইমজোন অফসেটের সাথে কোনও তারিখ ISO 8601 ফর্ম্যাট করবেন?


105

লক্ষ্য: অনুসন্ধান করুন local timeএবং UTC time offsetতারপরে নিম্নলিখিত ফর্ম্যাটে URL টি তৈরি করুন।

উদাহরণ URL: / ক্রিয়া / ঘুম? সময়কাল = 2002-10-10T12: 00: 00−05: 00

ফর্ম্যাটটি ডাব্লু 3 সি সুপারিশের ভিত্তিতে: http://www.w3.org/TR/xmlschema11-2/#dateTime

নথি বলছে:

উদাহরণস্বরূপ, 2002-10-10T12: 00: 00−05: 00 (10 অক্টোবর 2002 এ দুপুর, সেন্ট্রাল ডাইটলাইট সেভিংস টাইম পাশাপাশি মার্কিন যুক্তরাষ্ট্রে পূর্ব স্ট্যান্ডার্ড সময়) 2002-10-10T17: 00: 00Z, এর সমান 2002-10-10T12: 00: 00Z এর চেয়ে পাঁচ ঘন্টা পরে।

সুতরাং আমার বোঝার উপর ভিত্তি করে, আমার স্থানীয় তারিখটি নতুন তারিখের দ্বারা সন্ধান করতে হবে () তারপরে পার্থক্যটি গণনা করার জন্য getTimezoneOffset () ফাংশনটি ব্যবহার করুন এবং তারপরে স্ট্রিংয়ের শেষে যুক্ত করুন।

1. ফর্ম্যাট সঙ্গে স্থানীয় সময় পান

var local = new Date().format("yyyy-MM-ddThh:mm:ss"); //today (local time)

আউটপুট

2013-07-02T09:00:00

২. ঘন্টা ইউটিসি সময় অফসেট পেতে

var offset = local.getTimezoneOffset() / 60;

আউটপুট

7

৩.নিস্ট্রাক্ট ইউআরএল (কেবলমাত্র সময়ের অংশ)

var duration = local + "-" + offset + ":00";

আউটপুট:

2013-07-02T09:00:00-7:00

উপরের আউটপুটটির অর্থ আমার স্থানীয় সময় 2013/07/02 সকাল 9 টা এবং ইউটিসি থেকে পার্থক্য 7 ঘন্টা (ইউটিসি স্থানীয় সময় থেকে 7 ঘন্টা এগিয়ে)

এখনও অবধি এটি কাজ করছে বলে মনে হচ্ছে তবে যদি getTimezoneOffset () -120 এর মতো নেতিবাচক মান ফেরত দেয় তবে কী হবে?

আমি ভাবছি যে ফর্ম্যাটটি এমন ক্ষেত্রে দেখতে কেমন হবে কারণ আমি ডাব্লু 3 সি ডকুমেন্ট থেকে বুঝতে পারি না। আগাম ধন্যবাদ.

উত্তর:


185

নীচে সঠিকভাবে কাজ করা উচিত এবং সমস্ত ব্রাউজারের জন্য (টিপটির জন্য @ ম্যাটজহানসনকে ধন্যবাদ)

Date.prototype.toIsoString = function() {
    var tzo = -this.getTimezoneOffset(),
        dif = tzo >= 0 ? '+' : '-',
        pad = function(num) {
            var norm = Math.floor(Math.abs(num));
            return (norm < 10 ? '0' : '') + norm;
        };
    return this.getFullYear() +
        '-' + pad(this.getMonth() + 1) +
        '-' + pad(this.getDate()) +
        'T' + pad(this.getHours()) +
        ':' + pad(this.getMinutes()) +
        ':' + pad(this.getSeconds()) +
        dif + pad(tzo / 60) +
        ':' + pad(tzo % 60);
}

var dt = new Date();
console.log(dt.toIsoString());


4
সাইনটি GMT থেকে স্থানীয় সময় অফসেট নির্দেশ করে
স্টিভেন মোসলে

4
@ মাসাটো-সান আপনাকে
সাইনটি উল্টাতে

4
এখানে প্যাড ফাংশন মিলিসেকেন্ড ব্যতীত তারিখের প্রতিটি বিভাগের জন্য উপযুক্ত স্ট্রিং প্রদান করে। উদাহরণস্বরূপ, 5 মিমি জন্য একটি ইনপুট হিসাবে 05 ফিরে আসবে, যা 005 বলে মনে করা হবে Here এখানে একই ফাংশন jsbin
আহমেদ ফারুক

10
দয়া করে নোট করুন: এই উত্তরে একটি সূক্ষ্ম বাগ আছে। টাইমজোন অফসেটটি সঠিকভাবে গণনা করা হবে না যদি জোনটি অফসেটের মিনিট থাকে এবং negativeণাত্মক (যেমন -09: 30), যেমন ফ্রান্স এবং কানাডার কিছু নির্দিষ্ট অবস্থান। মোড একটি নেতিবাচক সংখ্যা ফেরত দেয়, সুতরাং অ্যাবস () এর আগে মেঝে () করা অজান্তেই অফসেটটিকে আরও নেতিবাচক করে তোলে। এই বাগটি সংশোধন করতে, তাই অ্যাবস () এবং THEN তল ()। উত্তরটি সম্পাদনা করার চেষ্টা করা হয়েছিল, তবে দৃশ্যত "এই সম্পাদনাটি পোষ্টের লেখককে সম্বোধন করার উদ্দেশ্যে করা হয়েছিল এবং সম্পাদনা হিসাবে কোনও ধারণা রাখেনি"।
tytk

6
@tytk - দুর্দান্ত ধরা! এটি, প্রকৃতপক্ষে, সূক্ষ্ম। আমি উত্তরে আপনার স্থিরতা যুক্ত করেছি। মন্তব্য করার জন্য ধন্যবাদ!
স্টিভেন মোসলে

68

getTimezoneOffset() আপনার উল্লেখ করা ফর্মটির প্রয়োজনীয় বিন্যাসের বিপরীত চিহ্নটি প্রদান করে।

এই ফর্ম্যাটটি আইএসও 8601 , বা আরও স্পষ্টভাবে আরএফসি 3339 হিসাবে পরিচিত

এই বিন্যাসে, ইউটিসি Zকিছুক্ষণের সাথে উপস্থাপিত হয় অন্য সমস্ত ফর্ম্যাটগুলি ইউটিসি থেকে অফসেট দ্বারা প্রতিনিধিত্ব করা হয়। অর্থ জাভাস্ক্রিপ্টের মতো একই, তবে বিয়োগের ক্রমটি উল্টে গেছে, ফলে ফলাফলটি বিপরীত চিহ্নটি বহন করে।

এছাড়াও, নেটিভ Dateনামে পরিচিত দেশটির কোনও পদ্ধতি নেই format, সুতরাং # 1 এ আপনার কার্যকারিতা ব্যর্থ হবে যদি না আপনি এটি অর্জনের জন্য কোনও লাইব্রেরি ব্যবহার করছেন না। পড়ুন এই ডকুমেন্টেশন

আপনি যদি এমন লাইব্রেরি খুঁজছেন যা এই ফর্ম্যাটটির সাথে সরাসরি কাজ করতে পারে তবে আমি moment.js চেষ্টা করার পরামর্শ দিচ্ছি । আসলে, এটি ডিফল্ট ফর্ম্যাট, সুতরাং আপনি কেবল এটি করতে পারেন:

var m = moment();    // get "now" as a moment
var s = m.format();  // the ISO format is the default so no parameters are needed

// sample output:   2013-07-01T17:55:13-07:00

এটি একটি ভাল-পরীক্ষিত, ক্রস ব্রাউজার সমাধান এবং এর মধ্যে আরও অনেক দরকারী বৈশিষ্ট্য রয়েছে।


ToISOString () ব্যবহার করা কার্যকর হবে না। +01: 00 ফর্ম্যাটের জন্য স্থানীয় সময় সময় অংশ হওয়া প্রয়োজন। toISOString () একটি ইউটিসি সময় স্ট্রিং দেয়।
অস্টিন ফ্রান্স

4
@ অস্টিনফ্রান্স - আপনি ঠিক বলেছেন! আমি অবাক হয়েছি যে আমি সেই সময়ে সেই ভুলটি করেছি, কারণ আমি প্রায়শই এই বিষয়টিতে অন্যকে সংশোধন করি। দুঃখিত দু'বছর আগে আমি আপনার মন্তব্যটি দেখিনি! উত্তর সম্পাদিত।
ম্যাট জনসন-পিন্ট

13

আমি মনে করি এটি বিবেচনা করার মতো যে আপনি আদর্শ লাইব্রেরিতে কেবলমাত্র একটি একক এপিআই কল দিয়ে অনুরোধ করা তথ্যটি পেতে পারেন ...

new Date().toLocaleString( 'sv', { timeZoneName: 'short' } );

// produces "2019-10-30 15:33:47 GMT−4"

আপনি যদি 'টি' ডিলিমেটার যুক্ত করতে চান, 'জিএমটি-' মুছে ফেলুন বা শেষের দিকে ': 00' যুক্ত করতে চান তবে আপনাকে পাঠ্য অদলবদল করতে হবে।

তবে আপনি উদাহরণস্বরূপ চাইলে সহজেই অন্যান্য অপশনগুলির সাথে খেলতে পারেন। 12 ঘন্টা সময় ব্যবহার করুন বা সেকেন্ড বাদ দিন ইত্যাদি etc.

নোট করুন যে আমি সুইডেনকে স্থানীয় হিসাবে ব্যবহার করছি কারণ এটি আইএসও 8601 ফর্ম্যাট ব্যবহার করে এমন একটি দেশ। আমি মনে করি বেশিরভাগ আইএসও দেশ টাইমজোন অন্য টাইমজোনকে টাইমজোন হিসাবে টাইপ জোনের সংক্ষিপ্তকরণ যেমন অফসেটের জন্য এই 'GMT-4' ফর্ম্যাটটি ব্যবহার করে। পূর্ব-দিনের আলো-সময়ের জন্য "ইডিটি"।

আপনি নতুন স্ট্যান্ডার্ড আই 18 এন ফাংশন "ইনটেল.ডেটটাইম ফর্ম্যাট ()" থেকে একই জিনিসটি পেতে পারেন তবে আপনাকে বিকল্পগুলির মাধ্যমে সময় অন্তর্ভুক্ত করতে এটি বলতে হবে বা এটি কেবল তারিখ দেবে।


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

5

এটি ক্লায়েন্টদের টাইমজোনগুলির জন্য আমার কাজ, এটি হালকা ওজন এবং সহজ and

  function getCurrentDateTimeMySql() {        
      var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds
      var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, 19).replace('T', ' ');
      var mySqlDT = localISOTime;
      return mySqlDT;
  }

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

3

এটা যাচাই কর:

function dateToLocalISO(date) {
    const off    = date.getTimezoneOffset()
    const absoff = Math.abs(off)
    return (new Date(date.getTime() - off*60*1000).toISOString().substr(0,23) +
            (off > 0 ? '-' : '+') + 
            (absoff / 60).toFixed(0).padStart(2,'0') + ':' + 
            (absoff % 60).toString().padStart(2,'0'))
}

// Test it:
d = new Date()

dateToLocalISO(d)
// ==> '2019-06-21T16:07:22.181-03:00'

// Is similar to:

moment = require('moment')
moment(d).format('YYYY-MM-DDTHH:mm:ss.SSSZ') 
// ==> '2019-06-21T16:07:22.181-03:00'

1

শুধু আমার দুজন এখানে প্রেরণ

তারিখের সময়গুলি নিয়ে আমি এই সমস্যার মুখোমুখি হয়েছিলাম তাই আমি যা করেছি তা হ'ল:

const moment = require('moment-timezone')

const date = moment.tz('America/Bogota').format()

তারপরে কিছু ক্যোয়ারী থেকে এটি তুলনা করতে সক্ষম হওয়ার জন্য ডিবিতে তারিখ সংরক্ষণ করুন।


স্থাপন করা moment-timezone

npm i moment-timezone

1

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

<input type="datetime-local" value="2020-02-16T19:30">

isoLocal="2020-02-16T19:30"
utcSeconds=new Date(isoLocal).getTime()/1000

//here you have 1581899400 for utcSeconds

let isoLocal=new Date(utcSeconds*1000-new Date().getTimezoneOffset()*60000).toISOString().substring(0,16)
2020-02-16T19:30

1

কয়েকটি সাধারণ এক্সটেনশন পদ্ধতিতে আপনি এটি অর্জন করতে পারেন। নিম্নলিখিত তারিখের এক্সটেনশন পদ্ধতিটি আইএসও ফর্ম্যাটে কেবল টাইমজোন উপাদানটি ফেরত দেয়, তারপরে আপনি তারিখ / সময় অংশের জন্য অন্য কোনওটিকে সংজ্ঞায়িত করতে পারেন এবং একটি সম্পূর্ণ তারিখ-সময়-অফসেট স্ট্রিংয়ের জন্য তাদের একত্রিত করতে পারেন।

Date.prototype.getISOTimezoneOffset = function () {
    const offset = this.getTimezoneOffset();
    return (offset < 0 ? "+" : "-") + Math.floor(Math.abs(offset / 60)).leftPad(2) + ":" + (Math.abs(offset % 60)).leftPad(2);
}

Date.prototype.toISOLocaleString = function () {
    return this.getFullYear() + "-" + (this.getMonth() + 1).leftPad(2) + "-" +
        this.getDate().leftPad(2) + "T" + this.getHours().leftPad(2) + ":" +
        this.getMinutes().leftPad(2) + ":" + this.getSeconds().leftPad(2) + "." +
        this.getMilliseconds().leftPad(3);
}

Number.prototype.leftPad = function (size) {
    var s = String(this);
    while (s.length < (size || 2)) {
        s = "0" + s;
    }
    return s;
}

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

var date = new Date();
console.log(date.toISOLocaleString() + date.getISOTimezoneOffset());
// Prints "2020-08-05T16:15:46.525+10:00"

আমি জানি এটি ২০২০ এবং বেশিরভাগ লোকেরা সম্ভবত এখনই মোমেন্ট.জেগুলি ব্যবহার করছেন তবে একটি সাধারণ অনুলিপি এবং অতীত সমাধান এখনও কখনও কখনও কার্যকর হয় না।

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


0

এই শেষের জন্য আমি ব্যবহৃত ফাংশনগুলি এখানে:

function localToGMTStingTime(localTime = null) {
    var date = localTime ? new Date(localTime) : new Date();
    return new Date(date.getTime() + (date.getTimezoneOffset() * 60000)).toISOString();
};

function GMTToLocalStingTime(GMTTime = null) {
    var date = GMTTime ? new Date(GMTTime) : new Date();;
    return new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString();
};

0
function setDate(){
    var now = new Date();
    now.setMinutes(now.getMinutes() - now.getTimezoneOffset());
    var timeToSet = now.toISOString().slice(0,16);

    /*
        If you have an element called "eventDate" like the following:

        <input type="datetime-local" name="eventdate" id="eventdate" />

        and you would like to  set the current and minimum time then use the following:
    */

    var elem = document.getElementById("eventDate");
    elem.value = timeToSet;
    elem.min = timeToSet;
}

-1

আমার উত্তরটি তাদের জন্য কিছুটা ভিন্নতা যারা কেবলমাত্র ওয়াইওয়াইওয়াই-এমএম-ডিডি ফর্ম্যাটে স্থানীয় সময় অঞ্চলে আজকের তারিখ চান।

আমাকে পরিষ্কার করা যাক:

আমার লক্ষ্য: পেতে আজকের তারিখ মধ্যে ব্যবহারকারীর টাইমজোন কিন্তু ISO8601 হিসাবে ফর্ম্যাট (হল YYYY-MM-ডিডি)

কোডটি এখানে:

new Date().toLocaleDateString("sv") // "2020-02-23" // 

এটি কাজ করে কারণ সুইডেন লোকাল আইএসও 8601 ফর্ম্যাটটি ব্যবহার করে।


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