我在哪裡可以找到有關在JavaScript中格式化日期的文檔?



Answers

momentjs

它是一個(輕量級)JavaScript日期庫,用於解析,操作和格式化日期。

var a = moment([2010, 1, 14, 15, 25, 50, 125]);
a.format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Sunday, February 14th 2010, 3:25:50 pm"
a.format("ddd, hA");                       // "Sun, 3PM"

(*)輕量級含義9.3KB縮小+ gzip以最小的可能設置(feb 2014)

Question

我注意到JavaScript的new Date()函數在接受多種格式的日期方面非常聰明。

Xmas95 = new Date("25 Dec, 1995 23:15:00")
Xmas95 = new Date("2009 06 12,12:52:39")
Xmas95 = new Date("20 09 2006,12:52:39")

在調用new Date()函數時,我無法在任何地方找到顯示所有有效字符串格式的文檔。

這是將字符串轉換為日期。 如果我們看一下另一面,即將日期對象轉換為字符串,直到現在我的印像是JavaScript沒有內置API來將日期對象格式化為字符串。

編者按:以下方法是提問者在特定瀏覽器上的嘗試,但一般不起作用; 請參閱此頁面上的答案以查看一些實際解決方案。

今天,我在日期對像上使用了toString()方法,並且令人驚訝地發揮了將日期格式化為字符串的作用。

var d1 = new Date();
d1.toString('yyyy-MM-dd');       //Returns "2009-06-29" in Internet Explorer, but not Firefox or Chrome
d1.toString('dddd, MMMM ,yyyy')  //Returns "Monday, June 29,2009" in Internet Explorer, but not Firefox or Chrome

同樣在這裡,我找不到任何有關我們可以將日期對象格式化為字符串的方式的任何文檔。

列出Date()對象支持的格式說明符的文檔在哪裡?




Personally, because I use both PHP and jQuery/javascript in equal measures, I use the date function from php.js http://phpjs.org/functions/date/

Using a library that uses the same format strings as something I already know is easier for me, and the manual containing all of the format string possibilities for the date function is of course online at php.net

You simply include the date.js file in your HTML using your preferred method then call it like this:

var d1=new Date();
var datestring = date('Y-m-d', d1.valueOf()/1000);

You can use d1.getTime() instead of valueOf() if you want, they do the same thing.

The divide by 1000 of the javascript timestamp is because a javascript timestamp is in miliseconds but a PHP timestamp is in seconds.




您可以使用meizz指出的新format方法來擴展Date對象,下面是作者給出的代碼。 這裡是一個jsfiddle

Date.prototype.format = function(format) //author: meizz
{
  var o = {
    "M+" : this.getMonth()+1, //month
    "d+" : this.getDate(),    //day
    "h+" : this.getHours(),   //hour
    "m+" : this.getMinutes(), //minute
    "s+" : this.getSeconds(), //second
    "q+" : Math.floor((this.getMonth()+3)/3),  //quarter
    "S" : this.getMilliseconds() //millisecond
  }

  if(/(y+)/.test(format)) format=format.replace(RegExp.$1,
    (this.getFullYear()+"").substr(4 - RegExp.$1.length));
  for(var k in o)if(new RegExp("("+ k +")").test(format))
    format = format.replace(RegExp.$1,
      RegExp.$1.length==1 ? o[k] :
        ("00"+ o[k]).substr((""+ o[k]).length));
  return format;
}

alert(new Date().format("yyyy-MM-dd"));
alert(new Date("january 12 2008 11:12:30").format("yyyy-MM-dd h:mm:ss"));



Just to continue gongzhitaao's solid answer - this handles AM/PM

 Date.prototype.format = function (format) //author: meizz
{
    var hours = this.getHours();
    var ttime = "AM";
    if(format.indexOf("t") > -1 && hours > 12)
    {
        hours = hours - 12;
        ttime = "PM";
     }

var o = {
    "M+": this.getMonth() + 1, //month
    "d+": this.getDate(),    //day
    "h+": hours,   //hour
    "m+": this.getMinutes(), //minute
    "s+": this.getSeconds(), //second
    "q+": Math.floor((this.getMonth() + 3) / 3),  //quarter
    "S": this.getMilliseconds(), //millisecond,
    "t+": ttime
}

if (/(y+)/.test(format)) format = format.replace(RegExp.$1,
  (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o) if (new RegExp("(" + k + ")").test(format))
    format = format.replace(RegExp.$1,
      RegExp.$1.length == 1 ? o[k] :
        ("00" + o[k]).substr(("" + o[k]).length));
return format;
}



JsSimpleDateFormat is a library that can format the date object and parse the formatted string back to Date object. It uses the Java format (SimpleDateFormat class). The name of months and days can be localized.

例:

var sdf = new JsSimpleDateFormat("EEEE, MMMM dd, yyyy");
var formattedString = sdf.format(new Date());
var dateObject = sdf.parse("Monday, June 29, 2009");






示例代碼:

var d = new Date();
var time = d.toISOString().replace(/.*?T(\d+:\d+:\d+).*/, "$1");

輸出:

"13:45:20"




我做了這個非常簡單的格式化程序,它被剪切/ n /可粘貼(更新為整潔版本):

function DateFmt(fstr) {
  this.formatString = fstr

  var mthNames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
  var dayNames = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
  var zeroPad = function(number) {
     return ("0"+number).substr(-2,2);
  }

  var dateMarkers = {
    d:['getDate',function(v) { return zeroPad(v)}],
    m:['getMonth',function(v) { return zeroPad(v+1)}],
    n:['getMonth',function(v) { return mthNames[v]; }],
    w:['getDay',function(v) { return dayNames[v]; }],
    y:['getFullYear'],
    H:['getHours',function(v) { return zeroPad(v)}],
    M:['getMinutes',function(v) { return zeroPad(v)}],
    S:['getSeconds',function(v) { return zeroPad(v)}],
    i:['toISOString']
  };

  this.format = function(date) {
    var dateTxt = this.formatString.replace(/%(.)/g, function(m, p) {
      var rv = date[(dateMarkers[p])[0]]()

      if ( dateMarkers[p][1] != null ) rv = dateMarkers[p][1](rv)

      return rv

    });

    return dateTxt
  }

}

fmt = new DateFmt("%w %d:%n:%y - %H:%M:%S  %i")
v = fmt.format(new Date())

http://snipplr.com/view/66968.82825/




If you don't need all the features that a library like momentjs provides, then you can use my port of strftime . It's lightweight (1.35 KB vs. 57.9 KB minified compared to Moment.js 2.15.0) and provides most of the functionality of strftime() .

/* Port of strftime(). Compatibility notes:
 *
 * %c - formatted string is slightly different
 * %D - not implemented (use "%m/%d/%y" or "%d/%m/%y")
 * %e - space is not added
 * %E - not implemented
 * %h - not implemented (use "%b")
 * %k - space is not added
 * %n - not implemented (use "\n")
 * %O - not implemented
 * %r - not implemented (use "%I:%M:%S %p")
 * %R - not implemented (use "%H:%M")
 * %t - not implemented (use "\t")
 * %T - not implemented (use "%H:%M:%S")
 * %U - not implemented
 * %W - not implemented
 * %+ - not implemented
 * %% - not implemented (use "%")
 *
 * strftime() reference:
 * http://man7.org/linux/man-pages/man3/strftime.3.html
 *
 * Day of year (%j) code based on Joe Orost's answer:
 * http://.com/questions/8619879/javascript-calculate-the-day-of-the-year-1-366
 *
 * Week number (%V) code based on Taco van den Broek's prototype:
 * http://techblog.procurios.nl/k/news/view/33796/14863/calculate-iso-8601-week-and-year-in-javascript.html
 */
function strftime(sFormat, date) {
  if (!(date instanceof Date)) date = new Date();
  var nDay = date.getDay(),
    nDate = date.getDate(),
    nMonth = date.getMonth(),
    nYear = date.getFullYear(),
    nHour = date.getHours(),
    aDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    aMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
    aDayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],
    isLeapYear = function() {
      if (nYear&3!==0) return false;
      return nYear%100!==0 || year%400===0;
    },
    getThursday = function() {
      var target = new Date(date);
      target.setDate(nDate - ((nDay+6)%7) + 3);
      return target;
    },
    zeroPad = function(nNum, nPad) {
      return ('' + (Math.pow(10, nPad) + nNum)).slice(1);
    };
  return sFormat.replace(/%[a-z]/gi, function(sMatch) {
    return {
      '%a': aDays[nDay].slice(0,3),
      '%A': aDays[nDay],
      '%b': aMonths[nMonth].slice(0,3),
      '%B': aMonths[nMonth],
      '%c': date.toUTCString(),
      '%C': Math.floor(nYear/100),
      '%d': zeroPad(nDate, 2),
      '%e': nDate,
      '%F': date.toISOString().slice(0,10),
      '%G': getThursday().getFullYear(),
      '%g': ('' + getThursday().getFullYear()).slice(2),
      '%H': zeroPad(nHour, 2),
      '%I': zeroPad((nHour+11)%12 + 1, 2),
      '%j': zeroPad(aDayCount[nMonth] + nDate + ((nMonth>1 && isLeapYear()) ? 1 : 0), 3),
      '%k': '' + nHour,
      '%l': (nHour+11)%12 + 1,
      '%m': zeroPad(nMonth + 1, 2),
      '%M': zeroPad(date.getMinutes(), 2),
      '%p': (nHour<12) ? 'AM' : 'PM',
      '%P': (nHour<12) ? 'am' : 'pm',
      '%s': Math.round(date.getTime()/1000),
      '%S': zeroPad(date.getSeconds(), 2),
      '%u': nDay || 7,
      '%V': (function() {
              var target = getThursday(),
                n1stThu = target.valueOf();
              target.setMonth(0, 1);
              var nJan1 = target.getDay();
              if (nJan1!==4) target.setMonth(0, 1 + ((4-nJan1)+7)%7);
              return zeroPad(1 + Math.ceil((n1stThu-target)/604800000), 2);
            })(),
      '%w': '' + nDay,
      '%x': date.toLocaleDateString(),
      '%X': date.toLocaleTimeString(),
      '%y': ('' + nYear).slice(2),
      '%Y': nYear,
      '%z': date.toTimeString().replace(/.+GMT([+-]\d+).+/, '$1'),
      '%Z': date.toTimeString().replace(/.+\((.+?)\)$/, '$1')
    }[sMatch] || sMatch;
  });
}

Sample usage:

strftime('%F'); // Returns "2016-09-15"
strftime('%A, %B %e, %Y'); // Returns "Thursday, September 15, 2016"

// You can optionally pass it a Date object...

strftime('%x %X', new Date('1/1/2016')); // Returns "1/1/2016 12:00:00 AM"

The latest code is available here: https://github.com/thdoan/strftime




列出Date()對象支持的格式說明符的文檔在哪裡?

今天我偶然發現了這個問題,對於沒有人花時間回答這個簡單問題感到非常驚訝。 當然,有很多圖書館可以幫助您控制日期。 有些比其他人好。 但這不是問題的問題。

AFAIK,純JavaScript不支持指定要使用它們的格式說明符。 但它支持格式化日期和/或時間的方法,例如.toLocaleDateString() .toLocaleTimeString().toUTCString()

我最經常使用的Date對象引用位於w3schools.com/jsref/jsref_obj_date.asp (但快速Google搜索將揭示更多可能更好地滿足您需求的內容)。

另請注意, 日期對象屬性部分提供了一個prototype鏈接,該鏈接說明了使用自定義方法擴展Date對象的一些方法。 JavaScript社區多年來一直存在一些關於這是否是最佳實踐的爭論 ,我並不是主張或反對它,只是指出它的存在。




The library sugar.js has some great functionality for working with dates in JavaScript. And it is very well documented .

Sugar gives the Date class much love starting with the Date.create method which can understand dates in just about any format in 15 major languages, including relative formats like "1 hour ago". Dates can also be output in any format or language using an easy to understand syntax, with shortcuts to commonly used date formats. Complex date comparison is also possible with methods like is, which understand any format and apply built in precision.

A few examples:

Date.create('July 4, 1776')  -> July 4, 1776
Date.create(-446806800000)   -> November 5, 1955
Date.create(1776, 6, 4)      -> July 4, 1776
Date.create('1776年07月04日', 'ja') -> July 4, 1776
Date.utc.create('July 4, 1776', 'en')  -> July 4, 1776

Date.create().format('{Weekday} {d} {Month}, {yyyy}')    -> Monday July 4, 2003
Date.create().format('{hh}:{mm}')                        -> 15:57
Date.create().format('{12hr}:{mm}{tt}')                  -> 3:57pm
Date.create().format(Date.ISO8601_DATETIME)              -> 2011-07-05 12:24:55.528Z

Date.create().is('the 7th of June') -> false
Date.create().addMonths(2); ->"Sunday, June 15, 2014 13:39"



這是我使用了很多的功能。 結果是yyyy-mm-dd hh:mm:ss.nnn。

function date_and_time() {
    var date = new Date();
    //zero-pad a single zero if needed
    var zp = function (val){
        return (val <= 9 ? '0' + val : '' + val);
    }

    //zero-pad up to two zeroes if needed
    var zp2 = function(val){
        return val <= 99? (val <=9? '00' + val : '0' + val) : ('' + val ) ;
    }

    var d = date.getDate();
    var m = date.getMonth() + 1;
    var y = date.getFullYear();
    var h = date.getHours();
    var min = date.getMinutes();
    var s = date.getSeconds();
    var ms = date.getMilliseconds();
    return '' + y + '-' + zp(m) + '-' + zp(d) + ' ' + zp(h) + ':' + zp(min) + ':' + zp(s) + '.' + zp2(ms);
}



簡答

沒有JavaScript支持的“通用”文檔; 每個具有JavaScript的瀏覽器都是一個實現。 但是,大多數現代瀏覽器傾向於遵循一個標準,那就是EMCAScript標準; ECMAScript標準字符串最少會採用ISO 8601定義的修改實現。

除此之外, IETF制定了第二個標準,即瀏覽器也遵循此IETF ,這是RFC 2822中定義的時間戳的定義。實際文檔可以在底部的參考列表中找到。

從這裡你可以期待基本的功能,但“應該”是什麼本質上不是“是”。 儘管如此,我仍然會深入一點,因為看起來只有三個人真的回答了這個問題(Scott,goofballLogic和peller),對我而言,這意味著大多數人不知道當你創建一個Date對象。

長答案

列出Date()對象支持的格式說明符的文檔在哪裡?


為了回答這個問題,或者通常甚至尋找這個問題的答案,你需要知道JavaScript不是一種新穎的語言; 它實際上是ECMAScript的一個實現,並且遵循ECMAScript標準(但是請注意,JavaScript實際上也是在這些標準之前進行的; EMCAScript標準是基於LiveScript / JavaScript的早期實現構建的)。 目前的ECMAScript標準是5.1(2011); 在最初提出這個問題時(2009年6月),標準為3(4被放棄),但在2009年底發布後不久發布了5個。這應該提出一個問題; 什麼標準的JavaScript實現可能遵循,可能並不反映實際到位,因為a)它是一個給定的標準的實現,b)並非所有標準的實現都是清教徒,並且c)功能不是與新標準d)實施是一項持續不斷的工作

基本上,在處理javascript時,你正在處理一個實現(javascript本身)的派生(JavaScript特定於瀏覽器)。 例如,Google的V8實現了ECMAScript 5.0,但Internet Explorer的JScript並不試圖符合任何ECMAScript標準,但Internet Explorer 9確實符合ECMAScript 5.0。

當一個參數傳遞給新的Date()時,它會投射這個函數原型:

new Date(value)

當兩個或更多的參數傳遞給新的Date()時,它會投射這個函數原型:

new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )


這兩個函數都應該看起來很熟悉,但是這並不能立即回答你的問題,而作為可接受的“日期格式”量化的東西需要進一步解釋。 當你將一個字符串傳遞給新的Date()時,它會調用原型(注意,我使用鬆散的單詞原型 ;版本可能是單個函數,或者它可能是單個函數中條件語句的一部分) 新的日期(值)與您的字符串作為“值”參數的參數。 這個函數將首先檢查它是一個數字還是一個字符串。 這個函數的文檔可以在這裡找到:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2

由此我們可以推斷,為了獲得新Date(值)所允許的字符串格式,我們必須查看Date.parse(string)方法。 這個方法的文檔可以在這裡找到:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2

我們可以進一步推斷日期預計將採用修改的ISO 8601擴展格式,如下所示:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

但是,我們可以從經驗中認識到,JavaScript的Date對象接受其他格式(首先由此問題的存在強制執行),這是可以的,因為ECMAScript允許實現特定的格式。 但是,這仍然不能回答可用格式上有哪些文檔可用的問題,也不能回答實際允許的格式。 我們將看看谷歌的JavaScript實現,V8; 請注意,我並不是說這是“最好”的JavaScript引擎(如何定義“最好”甚至“優秀”),並且不能認為V8中允許的格式代表當前可用的所有格式,但我認為這是公平的假設他們確實遵循現代期望。

Google的V8,date.js,DateConstructor

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141

查看DateConstructor函數,我們可以推斷我們需要找到DateParse函數; 但請注意,“年份”不是實際的年份,只是對“年份”參數的參考。

Google的V8,date.js,DateParse

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270

這將調用%DateParseString,它實際上是C ++函數的運行時函數引用。 它指的是下面的代碼:

Google的V8,runtime.cc,%DateParseString

https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559

我們在這個函數中關心的函數調用是用於DateParser :: Parse(); 忽略這些函數調用的邏輯,這些只是檢查符合編碼類型(ASCII和UC16)。 DateParser :: Parse在這裡定義:

Google的V8,dateparser-inl.h,DateParser :: Parse

https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36

這是實際定義它接受的格式的函數。 本質上,它檢查EMCAScript 5.0 ISO 8601標準,如果它不符合標準,則它將嘗試基於傳統格式構建日期。 基於評論的幾點要點:

  1. 解析器未知的第一個數字之前的單詞將被忽略。
  2. 括號內的文字被忽略。
  3. 無符號數字後跟“:”被解釋為“時間分量”。
  4. 無符號數字後跟“。”被解釋為“時間分量”,並且後面必須以毫秒為單位。
  5. 帶小數或小時分鐘的簽名數字(例如+5:15或+0515)被解釋為時區。
  6. 在聲明小時和分鐘時,可以使用“hh:mm”或“hhmm”。
  7. 指示時區的詞語被解釋為時區。
  8. 所有其他數字都被解釋為“日期組件”。
  9. 以月份的前三位開頭的所有單詞都被解釋為月份。
  10. 您可以使用兩種格式中的任何一種來定義分鐘和小時:“hh:mm”或“hhmm”。
  11. 數字處理完畢後,不允許使用“+”,“ - ”和不匹配的“)”等符號。
  12. 匹配多種格式的項目(例如1970-01-01)將作為符合標準的EMCAScript 5.0 ISO 8601字符串進行處理。

所以這應該足以給你一個關於將字符串傳遞給Date對象的期望的基本概念。 您可以通過查看Mozilla指向Mozilla開發者網絡(符合IETF RFC 2822時間戳)的以下規範來進一步擴展這一點:

http://tools.ietf.org/html/rfc2822#page-14

Microsoft開發人員網絡另外提到了Date對象的附加標準:ECMA-402,ECMAScript國際化API規範,它與ECMAScript 5.1標準(以及將來的標準)是互補的。 這可以在這裡找到:

http://www.ecma-international.org/ecma-402/1.0/

無論如何,這應該有助於強調沒有“文檔”能夠普遍表示所有的javascript實現,但是仍然有足夠的文檔可以合理地理解Date對象可以接受哪些字符串。 當你想到這個問題時,是否有問題? :P

參考

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

http://tools.ietf.org/html/rfc2822#page-14

http://www.ecma-international.org/ecma-402/1.0/

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270

https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559

https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36

資源

developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

http://msdn.microsoft.com/en-us/library/ff743760(v=vs.94).aspx




The correct way to format a date to return "2012-12-29" is with the script from JavaScript Date Format :

var d1 = new Date();
return d1.format("dd-m-yy");

This code does NOT work:

var d1 = new Date();
d1.toString('yyyy-MM-dd');      



All browsers

The most reliable way to format a date with the source format you're using, is to apply the following steps :

  1. Use new Date() to create a Date object
  2. Use .getDate() , .getMonth() and .getFullYear() to get respectively the day, month and year
  3. Paste the pieces together according to your target format

示例:

var date = '2015-11-09T10:46:15.097Z';

function format(input) {
    var date = new Date(input);
    return [
       ("0" + date.getDate()).slice(-2),
       ("0" + (date.getMonth()+1)).slice(-2),
       date.getFullYear()
    ].join('/');
}

document.body.innerHTML = format(date); // OUTPUT : 09/11/2015

(See also this Fiddle ).

Modern browsers only

You can also use the built-in .toLocaleDateString method to do the formatting for you. You just need pass along the proper locale and options to match the right format, which unfortunately is only supported by modern browsers (*) :

var date = '2015-11-09T10:46:15.097Z';

function format(input) {
    return new Date(input).toLocaleDateString('en-GB', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
    });
}

document.body.innerHTML = format(date); // OUTPUT : 09/11/2015

(See also this Fiddle ).

(*) According to the MDN , "Modern browsers" means Chrome 24+, Firefox 29+, IE11, Edge12+, Opera 15+ & Safari nightly build




Links