আমি কীভাবে জাভাস্ক্রিপ্টে কোনও আইএসও 8601 ফর্ম্যাট স্ট্রিং আউটপুট করব?


247

আমার একটা Dateজিনিস আছে আমি কীভাবে titleনীচের স্নিপেটের অংশটি রেন্ডার করব ?

<abbr title="2010-04-02T14:12:07">A couple days ago</abbr>

আমার অন্য লাইব্রেরির "কথায় আপেক্ষিক সময়" অংশ রয়েছে portion

আমি নিম্নলিখিত চেষ্টা করেছি:

function isoDate(msSinceEpoch) {

   var d = new Date(msSinceEpoch);
   return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T' +
          d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds();

}

তবে এটি আমাকে দেয়:

"2010-4-2T3:19"

উত্তর:


453

ইতিমধ্যে একটি ফাংশন নামে পরিচিত toISOString():

var date = new Date();
date.toISOString(); //"2011-12-19T15:28:46.493Z"

যদি কোনওভাবে আপনি কোনও ব্রাউজারে থাকেন তবে এটি সমর্থন করে না, আমি আপনাকে আবৃত করে তুলব:

if ( !Date.prototype.toISOString ) {
  ( function() {

    function pad(number) {
      var r = String(number);
      if ( r.length === 1 ) {
        r = '0' + r;
      }
      return r;
    }

    Date.prototype.toISOString = function() {
      return this.getUTCFullYear()
        + '-' + pad( this.getUTCMonth() + 1 )
        + '-' + pad( this.getUTCDate() )
        + 'T' + pad( this.getUTCHours() )
        + ':' + pad( this.getUTCMinutes() )
        + ':' + pad( this.getUTCSeconds() )
        + '.' + String( (this.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 )
        + 'Z';
    };

  }() );
}

1
.toISOString () অবশ্যই ইউটিসিতে তারিখটি ফেরত দেয়?
জন ওয়েলস

new Date("xx").toISOString()উত্পাদন করে NaN-NaN-NaNTNaN:NaN:NaN.NZনেটিভ বাস্তবায়ন RangeException ছোঁড়ার।
জোসেফ

আপনি যদি একটি সাবান পরিষেবাতে একটি তারিখের অবজেক্টটি পাস করতে চান ... তবে এটিই পথ! :) ধন্যবাদ।
থিংলিনাক্স

1
ওপি দ্বারা সরবরাহিত নমুনায় কোনও মিলিসেকেন্ড বা সময় অঞ্চল নেই।
ড্যান ড্যাসকলেসকু

"GetUTCFullYear" মত সকল ঐ ফাংশন কল ব্যর্থ কারণ তারা ইন্টারনেট ডকুমেন্ট মোড 5. পরিচিত না হয়
Elaskanator

63

পৃষ্ঠায় শেষ উদাহরণটি দেখুন https://developer.mozilla.org/en/Core_JavaScript_1.5_ উল্লেখ : গ্লোবাল_অবজেক্টস : তারিখ:

/* Use a function for the exact format desired... */
function ISODateString(d) {
    function pad(n) {return n<10 ? '0'+n : n}
    return d.getUTCFullYear()+'-'
         + pad(d.getUTCMonth()+1)+'-'
         + pad(d.getUTCDate())+'T'
         + pad(d.getUTCHours())+':'
         + pad(d.getUTCMinutes())+':'
         + pad(d.getUTCSeconds())+'Z'
}

var d = new Date();
console.log(ISODateString(d)); // Prints something like 2009-09-28T19:03:12Z

1
ওপি ( <abbr title="2010-04-02T14:12:07">) প্রদত্ত নমুনার কোনও টাইমজোন নেই। সম্ভবত তারা স্থানীয় সময় চেয়েছিল, যা কোনও ইউআই সময়ের স্ট্রিংয়ের জন্য কী বোঝায়?
ড্যান ড্যাসক্লেস্কু

60

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

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

মোমেন্ট.জেএস জাভাস্ক্রিপ্ট লাইব্রেরিটি ব্যবহার এবং নিম্নলিখিত কোডটি ব্যবহার করা আমার সেরা সমাধানটি এসেছে :

টাইমজোন তথ্য এবং মিলিসেকেন্ড সহ বর্তমান আইএসও সময় পেতে

now = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T20:11:11.234+0100"

now = moment().utc().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T19:11:11.234+0000"

now = moment().utc().format("YYYY-MM-DDTHH:mm:ss") + "Z"
// "2013-03-08T19:11:11Z" <- better use the native .toISOString() 

টাইমজোন তথ্য সহ কিন্তু মিলিসেকেন্ড ব্যতীত কোনও স্থানীয় জাভাস্ক্রিপ্টের তারিখ অবজেক্টের আইএসও সময় পেতে

var current_time = Date.now();
moment(current_time).format("YYYY-MM-DDTHH:mm:ssZZ")

এই তারিখ.জেড () এর মতো ফাংশন পেতে ডেট.জেএস এর সাথে একত্রিত করা যেতে পারে যার ফলস্বরূপ মুহুর্তে যেতে পারে।

এর মতো ফর্ম্যাট হওয়া একটি তারিখের স্ট্রিং হ'ল জেএসওন সংকলনকারী এবং এটি একটি ডেটাবেজে সঞ্চিত হওয়ার জন্য নিজেকে ভাল ধার দেয়। পাইথন এবং সি # এটি পছন্দ করেছে বলে মনে হচ্ছে।


21
খেজুর লোকদের সাথে চারপাশে জিনিস না। শুধু moment.js ব্যবহার করুন এবং আপনার চুল সংরক্ষণ করুন।
ভালামাস

1
আসলে পাইথন ও ডিবিতে এটি ব্যথা হয়ে দাঁড়ায়। ডিবি-র ইউটিসি ব্যবহার করুন (কোনও সমস্যা নেই, আপনি সহজেই ইউটিসি সার্ভার-সাইডে রূপান্তর করতে পারেন), সুতরাং আপনি যদি অফসেট তথ্য রাখতে চান তবে আপনার অন্য ক্ষেত্রের প্রয়োজন। এবং পাইথন জাভাস্ক্রিপ্টের মিলিসেকেন্ডগুলির পরিবর্তে ন্যানোসেকেন্ডগুলির ব্যবহার পছন্দ করে যা সাধারণত প্লে সেকেন্ডের চেয়ে যথেষ্ট এবং পছন্দনীয়। পাইথনে, কেবল ডেটুটিল.পার্সার.পারস এটি সঠিকভাবে পার্স করে এবং মিলিসেকেন্ডের আইএসও লিখতে একটি "_When = কখন.stftime" ("% Y-% m-% dT% H:% M:% S.% f% z) প্রয়োজন "); ফেরত _ যখন [: - 8] + _ যখন [-5:]" ন্যানোসকে মিলিতে রূপান্তর করতে। ইহা সুন্দর না.
ড্যানিয়েল এফ

3
আপনি আসলে ঠিক তাই মত বিন্যাস বাদ পারেন: moment(new Date()).format()। "1.5.0 সংস্করণ হিসাবে, বিন্যাস ছাড়াই # বিন্যাস কল করার সময় ডিএসএল হয়ে যাবে ... আইএসও 8601 ফর্ম্যাট YYYY-MM-DDTHH:mm:ssZ"। ডক: momentjs.com/docs/#/displaying/fromnow
ব্যবহারকারী 193130

1
গুড পয়েন্ট @ ইউজার ১৯৩১৩৩০ তবে আউটপুট দেশীয় পদ্ধতি থেকে পৃথক হওয়ার কারণে আপনাকে অবশ্যই সচেতন হতে হবে। moment().format() "2015-03-04T17:16:05+03:00" (new Date()).toISOString() "2015-03-04T14:16:24.555Z"
ওলগা

1
হয়তো বাছাইযোগ্য হতে পারে তবে এই উদাহরণগুলি ইউটিসি থেকে বর্তমান অফসেটটি ফিরিয়ে দেয়, সময় অঞ্চল নয়। একটি সময় অঞ্চল একটি ভৌগলিক অঞ্চল যা সাধারণত "আমেরিকা / টরন্টো" হিসাবে প্রকাশিত হয়। অনেক সময় অঞ্চলগুলি তাদের ইউটিসি অফসেটটি বছরে দুবার পরিবর্তন করে এবং টাইম জোনটি (সর্বদা) বর্তমান ইউটিসি অফসেট থেকে নির্ধারণ করা যায় না ... সুতরাং এই উত্তরটি টাইম জোনের তথ্যও ফেলে দিচ্ছে :-)
মার্টিন ফিদো

27

জিজ্ঞাসিত প্রশ্নটি হ্রাস নির্ভুলতার সাথে আইএসও ফর্ম্যাট । voila:

 new Date().toISOString().slice(0, 19) + 'Z'
 // '2014-10-23T13:18:06Z'

অনুমান করা জেডটি চাইছে, অন্যথায় কেবল বাদ দিন।


14

সংক্ষিপ্ততম, তবে ইন্টারনেট এক্সপ্লোরার 8 এবং এর আগে সমর্থিত নয়:

new Date().toJSON()

12

আপনার যদি আই 7 সমর্থন করার প্রয়োজন না হয় তবে নিম্নলিখিতটি একটি দুর্দান্ত, সংক্ষিপ্ত হ্যাক:

JSON.parse(JSON.stringify(new Date()))

আই 7-র ক্ষেত্রে এই সিদ্ধান্তটিও উপযুক্ত যদি জসন 3-লাইব্রেরি অন্তর্ভুক্ত করা হত ( বেসটিজস . github.io/json3 )। ধন্যবাদ :)
ভ্লাদিমির

আইই 8 এও ব্যর্থ। ("'জেএসএন' অপরিবর্তিত আছে")
সিস টিমর্ম্যান

1
জেএসএনের মাধ্যমে গোল-ট্রিপিং কুৎসিত, বিশেষত যদি আপনার বর্ণিত লক্ষ্যটি সংক্ষিপ্ততা হয়; toJSONপরিবর্তে তারিখের পদ্ধতিটি ব্যবহার করুন। JSON.stringifyএটি যাইহোক প্রচ্ছদের অধীনে এটি ব্যবহার করছে।
মার্ক আমেরিকা

@CesesTimmerman IE8 JSONঅবজেক্টটি সমর্থন করে যদিও কিছু সামঞ্জস্যতা মোডে নয়। স্ট্যাকওভারফ্লো.com
মার্ক আমেরিকা

3
এটি কোন দিক থেকে ভাল .toISOString()?
মার্টিন

7

গ্রাহকরা তাদের মাথায় রূপান্তর করতে পছন্দ করেন না বলে আমি সাধারণত কোনও ইউটিসি তারিখ প্রদর্শন করতে চাই না। স্থানীয় আইএসও তারিখ প্রদর্শন করতে , আমি এই ফাংশনটি ব্যবহার করি:

function toLocalIsoString(date, includeSeconds) {
    function pad(n) { return n < 10 ? '0' + n : n }
    var localIsoString = date.getFullYear() + '-'
        + pad(date.getMonth() + 1) + '-'
        + pad(date.getDate()) + 'T'
        + pad(date.getHours()) + ':'
        + pad(date.getMinutes()) + ':'
        + pad(date.getSeconds());
    if(date.getTimezoneOffset() == 0) localIsoString += 'Z';
    return localIsoString;
};

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

function getOffsetFromUTC() {
    var offset = new Date().getTimezoneOffset();
    return ((offset < 0 ? '+' : '-')
        + pad(Math.abs(offset / 60), 2)
        + ':'
        + pad(Math.abs(offset % 60), 2))
};

toLocalIsoStringব্যবহার pad। প্রয়োজনে এটি প্রায় কোনও প্যাড ফাংশনের মতো কাজ করে তবে সম্পূর্ণতার জন্য এটি আমি ব্যবহার করি:

// Pad a number to length using padChar
function pad(number, length, padChar) {
    if (typeof length === 'undefined') length = 2;
    if (typeof padChar === 'undefined') padChar = '0';
    var str = "" + number;
    while (str.length < length) {
        str = padChar + str;
    }
    return str;
}

3

'টি' এর পরে একটি '+' নিখোঁজ রয়েছে

isoDate: function(msSinceEpoch) {
  var d = new Date(msSinceEpoch);
  return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T'
         + d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds();
}

এটা করা উচিত।

শীর্ষস্থানীয় শূন্যগুলির জন্য আপনি এখান থেকে এটি ব্যবহার করতে পারেন :

function PadDigits(n, totalDigits) 
{ 
    n = n.toString(); 
    var pd = ''; 
    if (totalDigits > n.length) 
    { 
        for (i=0; i < (totalDigits-n.length); i++) 
        { 
            pd += '0'; 
        } 
    } 
    return pd + n.toString(); 
} 

এটি এটির মতো ব্যবহার করে:

PadDigits(d.getUTCHours(),2)

দুর্দান্ত ধর! এটি অনুপস্থিত "0" গুলি সম্বোধন করে না।
জেমস এ রোজেন

1
একটি পূর্ণসংখ্যাটিকে 2-বর্ণের স্ট্রিংয়ে রূপান্তর করতে একটি ফাংশন লিখুন (যুক্তি 10 এর চেয়ে কম হলে '0' প্রিপেন্ড করুন) এবং তারিখ / সময়ের প্রতিটি অংশের জন্য এটি কল করুন।
dan04

3
function timeStr(d) { 
  return ''+
    d.getFullYear()+
    ('0'+(d.getMonth()+1)).slice(-2)+
    ('0'+d.getDate()).slice(-2)+
    ('0'+d.getHours()).slice(-2)+
    ('0'+d.getMinutes()).slice(-2)+
    ('0'+d.getSeconds()).slice(-2);
}

1
আইআই 5 মোডে আমাকে এই রুটটি যেতে হয়েছিল যেহেতু এখানে অন্যান্য সমস্ত উত্তর অস্তিত্বহীন ফাংশন ব্যবহার করে।
এলাস্কানেটর

3

টোআইএসএসটিংয়ের সমস্যাটি হ'ল এটি কেবল "জেড" হিসাবে ডেটটাইম দেয়।

আইএসও -8601 সময়সীমার সময়কে ঘন্টা এবং মিনিটের মধ্যে পার্থক্য সহ 2016-07-16 টি 19: 20: 30 + 5: 30 (যখন টাইমজোনটি ইউটিসি এগিয়ে থাকবে) এবং 2016-07-16টি 19: 20: 30-01 : 00 (যখন টাইমজোনটি ইউটিসির পিছনে থাকে)।

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



    var timezone_offset_min = new Date().getTimezoneOffset(),
        offset_hrs = parseInt(Math.abs(timezone_offset_min/60)),
        offset_min = Math.abs(timezone_offset_min%60),
        timezone_standard;

    if(offset_hrs < 10)
        offset_hrs = '0' + offset_hrs;

    if(offset_min > 10)
        offset_min = '0' + offset_min;

    // getTimezoneOffset returns an offset which is positive if the local timezone is behind UTC and vice-versa.
    // So add an opposite sign to the offset
    // If offset is 0, it means timezone is UTC
    if(timezone_offset_min < 0)
        timezone_standard = '+' + offset_hrs + ':' + offset_min;
    else if(timezone_offset_min > 0)
        timezone_standard = '-' + offset_hrs + ':' + offset_min;
    else if(timezone_offset_min == 0)
        timezone_standard = 'Z';

    // Timezone difference in hours and minutes
    // String such as +5:30 or -6:00 or Z
    console.log(timezone_standard); 

আপনি সময় এবং ঘন্টা কয়েক মিনিট অফসেট পরে, আপনি একটি ডেটটাইম স্ট্রিং যোগ করতে পারেন।

আমি এটিতে একটি ব্লগ পোস্ট লিখেছিলাম: http://usefulangle.com/post/30/javascript-get-date-time-with-offset-hours-minutes



2

আমি খুব কম কোড দিয়ে আউটপুট পেতে সক্ষম হয়েছি।

var ps = new Date('2010-04-02T14:12:07')  ;
ps = ps.toDateString() + " " + ps.getHours() + ":"+ ps.getMinutes() + " hrs";

আউটপুট:

Fri Apr 02 2010 19:42 hrs

0
function getdatetime() {
    d = new Date();
    return (1e3-~d.getUTCMonth()*10+d.toUTCString()+1e3+d/1)
        .replace(/1(..)..*?(\d+)\D+(\d+).(\S+).*(...)/,'$3-$1-$2T$4.$5Z')
        .replace(/-(\d)T/,'-0$1T');
}

আমি স্ট্যাক ওভারফ্লোতে কোথাও বেসিকগুলি খুঁজে পেয়েছি (আমি বিশ্বাস করি এটি অন্য কোনও স্ট্যাক এক্সচেঞ্জ কোড গল্ফিংয়ের অংশ ছিল) এবং আমি এটিকে উন্নত করেছি যাতে এটি ইন্টারনেট এক্সপ্লোরার 10 বা তার আগেরও কাজ করে। এটি কুৎসিত, তবে এটি কাজটি সম্পন্ন করে।


0

কিছু চিনি এবং আধুনিক সিনট্যাক্সের সাথে শানের দুর্দান্ত এবং সংক্ষিপ্ত উত্তরটি প্রসারিত করতে:

// date.js

const getMonthName = (num) => {
  const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Oct', 'Nov', 'Dec'];
  return months[num];
};

const formatDate = (d) => {
  const date = new Date(d);
  const year = date.getFullYear();
  const month = getMonthName(date.getMonth());
  const day = ('0' + date.getDate()).slice(-2);
  const hour = ('0' + date.getHours()).slice(-2);
  const minutes = ('0' + date.getMinutes()).slice(-2);

  return `${year} ${month} ${day}, ${hour}:${minutes}`;
};

module.exports = formatDate;

তারপরে যেমন।

import formatDate = require('./date');

const myDate = "2018-07-24T13:44:46.493Z"; // Actual value from wherever, eg. MongoDB date
console.log(formatDate(myDate)); // 2018 Jul 24, 13:44
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.