Где можно найти документацию по форматированию даты в JavaScript?

Я заметил, что функция 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()?

Ответ 1

Мне нравятся 10 способов форматирования времени и даты с использованием JavaScript и работы с датами.

По сути, у вас есть три метода, и вы должны объединить строки для себя:

getDate() // Returns the date
getMonth() // Returns the month
getFullYear() // Returns the year

Пример:

var d = new Date();
var curr_date = d.getDate();
var curr_month = d.getMonth() + 1; //Months are zero based
var curr_year = d.getFullYear();
console.log(curr_date + "-" + curr_month + "-" + curr_year);

Ответ 2

Moment.js

Это (легкая) * библиотека дат 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, minified + gzipped в наименьшей возможной настройке (feb 2014)

Ответ 3

Если вы уже используете jQuery UI в своем проекте, вы можете использовать встроенный метод datepicker для форматирования вашего объекта даты:

$.datepicker.formatDate('yy-mm-dd', new Date(2007, 1 - 1, 26));

Однако datepicker только форматирует даты и не может форматировать время.

Посмотрите jQuery UI datepicker formatDate, примеры.

Ответ 4

Где находится документация, в которой перечислены спецификаторы формата, поддерживаемые объектом Date()?

Я наткнулся на это сегодня и был очень удивлен, что никто не нашел времени, чтобы ответить на этот простой вопрос. Правда, есть много библиотек для помощи в обработке даты. Некоторые из них лучше других. Но об этом не спрашивали.

AFAIK, чистый JavaScript не поддерживает спецификаторы формата , как вы указали, что хотите использовать их. Но он поддерживает методы форматирования дат и/или времени, например .toLocaleDateString(), .toLocaleTimeString() и .toUTCString().

Ссылка на объект Date, которую я использую наиболее часто, находится на веб-сайте w3schools.com (но быстрый поиск Google покажет еще много, которые могут лучше соответствовать вашим потребностям).

Также обратите внимание, что в разделе Свойства объекта даты приведена ссылка на prototype, которая иллюстрирует некоторые способы продления объекта Date с пользовательскими методами. В течение нескольких лет в сообществе JavaScript было несколько дискуссий о том, является ли это лучшей практикой, и я не выступаю за нее или против нее, просто указывая на ее существование.

Ответ 5

Пользовательская функция форматирования:

Для фиксированных форматов простую функцию выполняет задание. В следующем примере создается международный формат ГГГГ-ММ-ДД:

function dateToYMD(date) {
    var d = date.getDate();
    var m = date.getMonth() + 1;
    var y = date.getFullYear();
    return '' + y + '-' + (m<=9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d);
}

Примечание. Однако, как правило, не рекомендуется распространять стандартные библиотеки Javascript (например, добавив эту функцию в прототип даты).

Более продвинутая функция может генерировать настраиваемый вывод на основе параметра формата. На этой же странице есть несколько хороших примеров.

Если написать функцию форматирования слишком долго, существует множество библиотек, вокруг которых это делается. Некоторые другие ответы уже перечисляют их. Но растущие зависимости также имеют противоположную часть.

Стандартные функции форматирования ECMAScript:

Начиная с более поздних версий ECMAscript, класс Date имеет определенные функции форматирования:

toDateString: зависит от реализации, показывается только дата.

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.todatestring

new Date().toDateString(); // e.g. "Fri Nov 11 2016"

toISOString. Показывать дату и время ISO 8601.

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.toisostring

new Date().toISOString(); // e.g. "2016-11-21T08:00:00.000Z"

toJSON: Stringifier для JSON.

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tojson

new Date().toJSON(); // e.g. "2016-11-21T08:00:00.000Z"

toLocaleDateString: зависит от реализации, дата в формате локали.

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocaledatestring

new Date().toLocaleDateString(); // e.g. "21/11/2016"

toLocaleString: зависит от реализации, дата и время в формате локали.

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocalestring

new Date().toLocaleString(); // e.g. "21/11/2016, 08:00:00 AM"

toLocaleTimeString: зависит от реализации, время в формате локали.

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocaletimestring

new Date().toLocaleTimeString(); // e.g. "08:00:00 AM"

toString: общий параметр toString для даты.

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tostring

new Date().toString(); // e.g. "Fri Nov 11 2016 08:00:00 GMT+0100 (W. Europe Standard Time)"

Примечание. Из этих функций форматирования можно создавать пользовательский вывод:

new Date().toISOString().slice(0,10); // By @Image72, return YYYY-MM-DD

Ответ 6

Короткий ответ

Нет "универсальной" документации, к которой подходит JavaScript; каждый браузер, у которого есть javascript, действительно является реализацией. Тем не менее, существует стандарт, который, как правило, придерживаются большинство современных браузеров, и это стандарт EMCAScript; стандартные строки ECMAScript, в минимальной степени, должны были модифицировать реализацию определения ISO 8601.

В дополнение к этому, существует второй стандарт, установленный IETF, который, как правило, также просматривают браузеры, что является определением для временные метки, сделанные в RFC 2822. Фактическая документация может быть найдена в списке ссылок внизу.

Из этого вы можете ожидать базовые функциональные возможности, но то, что "должно" быть не по своей сути, "есть". Я собираюсь пойти немного глубже с этим процедурным, хотя, как кажется, только три человека действительно ответили на вопрос (Скотт, goofballLogic и peller именно), которые, как мне кажется, указывают на то, что большинство людей не знают, что на самом деле происходит, когда вы создаете Объект даты.


Длительный ответ

Где находится документация, в которой перечислены спецификаторы формата, поддерживаемые объектом Date()?


Чтобы ответить на вопрос или, как правило, даже искать ответ на этот вопрос, вам нужно знать, что javascript не является новым языком; на самом деле это реализация ECMAScript и соответствует стандартам ECMAScript (но обратите внимание, что javascript также на самом деле был заранее подготовлен к этим стандартам, стандарты EMCAScript построены на ранней реализации LiveScript/JavaScript). Текущий стандарт ECMAScript - 5,1 (2011 год); в то время, когда вопрос был первоначально задан (09 июня), стандарт был 3 (4 были оставлены), но 5 был выпущен вскоре после публикации в конце 2009 года. Это должно указать одну проблему; какой стандарт реализации javascript может следовать, может не отражать то, что на самом деле существует, потому что: а) его реализация данного стандарта; б) не все реализации стандарта пуританские, а в) функциональность не выдается синхронно с новый стандарт как d) реализация - постоянная работа в процессе

По существу, имея дело с javascript, вы имеете дело с производным (javascript, специфичным для браузера) реализации (сам javascript). Googles V8, например, реализует ECMAScript 5.0, но Internet Explorers 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 (value), мы должны рассмотреть метод 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

Тем не менее, по опыту мы можем признать, что объект javascripts Date принимает другие форматы (в первую очередь связанные с существованием этого вопроса), и это нормально, потому что ECMAScript допускает конкретные форматы реализации. Тем не менее, это все равно не отвечает на вопрос о том, какая документация доступна в доступных форматах, и какие форматы фактически разрешены. Собирались взглянуть на реализацию javascript Googles, V8; обратите внимание, что Im не предполагает, что это "лучший" механизм javascript (как определить "лучший" или даже "хороший" ), и нельзя предположить, что форматы, разрешенные в V8, представляют все доступные сегодня форматы, но я думаю, что это справедливо предположить они следуют современным ожиданиям.

Googles V8, date.js, DateConstructor

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

Посмотрев на функцию DateConstructor, мы можем найти, что нам нужно найти функцию DateParse; однако обратите внимание, что "год" не является фактическим годом и является только ссылкой на параметр "год".

Googles V8, date.js, DateParse

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

Это вызывает% DateParseString, которая на самом деле является ссылкой на функцию времени выполнения для функции С++. Он ссылается на следующий код:

Googles 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 и, если он не соответствует стандартам, тогда он попытается создать дату на основе устаревших форматов. Несколько ключевых моментов, основанных на комментариях:

  • Слова перед тем, как первое число, неизвестное синтаксическому анализатору, игнорируется.
  • Воспроизведение в скобках игнорируется.
  • Беззнаковые числа, за которыми следуют ":", интерпретируются как "компонент времени".
  • Беззнаковые числа, за которыми следует "." интерпретируются как "компонент времени" и должны сопровождаться миллисекундами.
  • Подписанные номера, за которыми следует часовой или час (например, +5: 15 или +0515), интерпретируются как часовой пояс.
  • При объявлении часа и минуты вы можете использовать "hh: mm" или "hhmm".
  • Слова, указывающие часовой пояс, интерпретируются как часовой пояс.
  • Все остальные номера интерпретируются как "компоненты даты".
  • Все слова, начинающиеся с первых трех цифр месяца, интерпретируются как месяц.
  • Вы можете определить минуты и часы вместе в любом из двух форматов: "hh: mm" или "hhmm".
  • Символы типа "+", "-" и непревзойденные ")" не разрешены после обработки номера.
  • Элементы, которые соответствуют нескольким форматам (например, 1970-01-01), обрабатываются как стандартная строка стандарта ISO 8601 EMCAScript 5.0.

Итак, этого должно быть достаточно, чтобы дать вам общее представление о том, что ожидать, когда дело доходит до передачи строки в объект Date. Вы можете дополнительно расширить это, посмотрев следующую спецификацию, которую Mozilla указывает на сеть разработчиков Mozilla (соответствует меткам времени IETF RFC 2822):

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

В Microsoft Developer Network дополнительно упоминается дополнительный стандарт для объекта Date: ECMA-402, спецификация API интернационализации ECMAScript, которая дополняет стандарт 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

Ресурсы

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

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

Ответ 7

Убедитесь, что вы заказываете Datejs при работе с датами в JavaScript. Это довольно впечатляет и хорошо документировано, как вы можете видеть в случае функции toString.

EDIT: Тайлер Форсайт указывает, что datejs устарел. Я использую его в своем текущем проекте и не испытываю никаких проблем с ним, однако вы должны знать об этом и рассматривать альтернативы.

Ответ 8

Вы можете просто расширить объект Date с помощью нового метода format, как указано meizz, ниже приведен код, приведенный автор. А также здесь 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"));

Ответ 9

Функциональность, которую вы цитируете, не является стандартным Javascript, вряд ли будет переносимой в разных браузерах и, следовательно, не является хорошей практикой. спецификация ECMAScript 3 оставляет возможности синтаксического анализа и выходных форматов вплоть до реализации Javascript. ECMAScript 5 добавляет подмножество поддержки ISO8601. Я считаю, что функция toString(), которую вы упомянули, является нововведением в одном браузере (Mozilla?)

Несколько библиотек предоставляют процедуры для параметризации, некоторые из которых имеют обширную поддержку локализации. Вы также можете проверить методы в dojo.date.locale.

Ответ 10

Я сделал этот очень простой форматтер, он вырезал /n/pastable (Обновлен с опрятной версией):

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/

Ответ 11

Рамка свободная, ограниченная, но легкая

var d = (new Date()+'').split(' ');
// ["Tue", "Sep", "03", "2013", "21:54:52", "GMT-0500", "(Central", "Daylight", "Time)"]

[d[3], d[1], d[2], d[4]].join(' ');
// "2013 Sep 03 21:58:03"

Ответ 13

Просмотрев несколько вариантов, представленных в других ответах, я решил написать собственное ограниченное, но простое решение, которое другие могут также найти полезным.

/**
* Format date as a string
* @param date - a date object (usually "new Date();")
* @param format - a string format, eg. "DD-MM-YYYY"
*/
function dateFormat(date, format) {
    // Calculate date parts and replace instances in format string accordingly
    format = format.replace("DD", (date.getDate() < 10 ? '0' : '') + date.getDate()); // Pad with '0' if needed
    format = format.replace("MM", (date.getMonth() < 9 ? '0' : '') + (date.getMonth() + 1)); // Months are zero-based
    format = format.replace("YYYY", date.getFullYear());
    return format;
}

Пример использования:

console.log("The date is: " + dateFormat(new Date(), "DD/MM/YYYY"));

Ответ 14

Здесь функция, которую я использую много. Результат: 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);
}

Ответ 15

Вы можете найти полезную эту модификацию объекта даты, которая меньше любой библиотеки и легко расширяется для поддержки различных форматов:

Примечание:

  • Он использует Object.keys(), который undefined в старых браузерах, поэтому вам может понадобиться реализовать polyfill из данной ссылки.

CODE

Date.prototype.format = function(format) {
    // set default format if function argument not provided
    format = format || 'YYYY-MM-DD hh:mm';

    var zeropad = function(number, length) {
            number = number.toString();
            length = length || 2;
            while(number.length < length)
                number = '0' + number;
            return number;
        },
        // here you can define your formats
        formats = {
            YYYY: this.getFullYear(),
            MM: zeropad(this.getMonth() + 1),
            DD: zeropad(this.getDate()),
            hh: zeropad(this.getHours()),
            mm: zeropad(this.getMinutes())
        },
        pattern = '(' + Object.keys(formats).join(')|(') + ')';

    return format.replace(new RegExp(pattern, 'g'), function(match) {
        return formats[match];
    });
};

USE

var now = new Date;
console.log(now.format());
// outputs: 2015-02-09 11:47
var yesterday = new Date('2015-02-08');
console.log(yesterday.format('hh:mm YYYY/MM/DD'));
// outputs: 00:00 2015/02/08

Ответ 16

Просто, чтобы продолжить gongzhitaao солидный ответ - это обрабатывает 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;
}

Ответ 17

Мне не удалось найти окончательную документацию по допустимым форматам дат, поэтому я написал свой собственный тест, чтобы узнать, что поддерживается в разных браузерах.

http://blarg.co.uk/blog/javascript-date-formats

Мои результаты пришли к выводу, что следующие форматы действительны во всех проверенных мной браузерах (примеры используют дату "9 августа 2013 года" ):

[Полный год]/[Месяц]/[Номер даты]. Месяцем может быть либо номер с или без начального нуля, либо имя месяца в коротком или длинном формате, а номер даты может быть с нулевым или без него.

  • 2013/08/09
  • 2013/08/9
  • 2013/8/09
  • 2013/8/9
  • 2013/Август/09
  • 2013/Август/9
  • 2013/Август/09
  • 2013/Август/9

[Месяц]/[Годовой год]/[Номер даты]. Месяцем может быть либо номер с или без начального нуля, либо имя месяца в коротком или длинном формате, а номер даты может быть с нулевым или без него.

  • 08/2013/09
  • 08/2013/9
  • 8/2013/09
  • 8/2013/9
  • Август /2013/09
  • Август /2013/9
  • Август /2013/09
  • Август /2013/9

Любая комбинация из [Полного года], [Месяц] и [Номер даты], разделенных пробелами - Название месяца может быть в коротком или длинном формате, а номер даты может быть с или без начальный ноль.

  • 2013 Август 09
  • Август 2013 09
  • 09 Август 2013
  • 2013 Aug 09
  • 9 августа 2013 г.
  • 2013 9 авг.
  • и т.д...

Также действителен в "современных браузерах" (или, другими словами, все браузеры, кроме IE9 и ниже)

[Полный год] - [Номер месяца] - [Номер даты] - Месяц и дата. Номер должен содержать начальные нули (это формат, который Тип даты MySQL)

  • 2013-08-09

Использование имен месяцев:
Интересно отметить, что при использовании имен месяцев я обнаружил, что используются только первые 3 символа имени месяца, поэтому все из них совершенно верны:

new Date('9 August 2013');
new Date('9 Aug 2013');
new Date('9 Augu 2013');
new Date('9 Augustagfsdgsd 2013');

Ответ 18

Форматирование и особенно синтаксический анализ в JavaScript может быть немного головной болью. Не все браузеры обрабатывают даты таким же образом. Поэтому, хотя полезно знать базовые методы, более практично использовать вспомогательную библиотеку.

javascript-библиотека XDate от Adam Shaw существует с середины 2011 года и все еще находится в активной развитие. Он имеет фантастическую документацию, отличный API, форматирование, пытается оставаться обратно совместимым и даже поддерживает локализованные строки.

Ссылка на изменение строк локали: https://gist.github.com/1221376

Ответ 19

Библиотека sugar.js имеет отличную функциональность для работы с датами в JavaScript. И это очень хорошо документировано.

Sugar дает классу Date много любви, начиная с метода Date.create, который может понимать даты практически в любом формате на 15 основных языках, включая относительные форматы, такие как "1 час назад". Даты также могут выводиться в любом формате или на языке, используя простой для понимания синтаксис, с ярлыками к обычно используемым форматам дат. Сложное сравнение дат также возможно с помощью методов типа is, которые понимают любой формат и применяют встроенную точность.

Несколько примеров:

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"

Ответ 20

Пример кода:

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

Вывод:

"13:45:20"

Ответ 21

Все браузеры

Самый надежный способ форматирования даты с использованием исходного формата, который вы используете, - это выполнить следующие шаги:

  1. Используйте new Date() для создания объекта Date
  2. Используйте .getDate(), .getMonth() и .getFullYear() чтобы получить соответственно день, месяц и год
  3. Вставьте части вместе в соответствии с вашим целевым форматом

Пример:

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

Ответ 22

Еще один вариант, который я написал:

Библиотека DP_DateExtensions

Не уверен, что это поможет, но я нашел его полезным в нескольких проектах - похоже, что он сделает то, что вам нужно.

Поддерживает форматирование даты и времени, математику даты (детали добавления/вычитания даты), сопоставление даты, синтаксический анализ и т.д. Это либерально раскрывается.

Нет причин считать это, если вы уже используете фреймворк (все они способны), но если вам просто нужно быстро добавить манипуляции дат в проект, дайте ему шанс.

Ответ 23

Правильный способ форматирования даты для возвращения "2012-12-29" - это script из Формат даты JavaScript:

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

Этот код НЕ работает:

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

Ответ 24

Если вы хотите показывать только время с двумя цифрами, это может помочь вам:

var now = new Date();
var cHour = now.getHours();
var cMinuts = now.getMinutes();
var cSeconds = now.getSeconds();

var outStr = (cHour <= 0 ? ('0' + cHour) : cHour) + ':' + (cMinuts <= 9 ? ('0' + cMinuts) : cMinuts) + ':' + (cSeconds <= 9 ? '0' + cSeconds : cSeconds);

Ответ 26

JsSimpleDateFormat - это библиотека, которая может форматировать объект даты и анализировать форматированную строку обратно на объект Date. Он использует формат Java (класс SimpleDateFormat). Название месяцев и дней может быть локализовано.

Пример:

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

Ответ 27

Ответ "нигде", поскольку форматирование даты - это собственная функциональность. Я не думаю, что функции toString предназначены для соответствия определенному формату. например в спецификации ECMAScript 5.1 (http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf, 2/8/2013, стр. 173), функция toString документируется следующим образом:

"Содержимое строки зависит от реализации"

Функции, такие как приведенные ниже примеры, могут использоваться для упрощения форматирования.

function pad(toPad, padWith) {
    return (String(padWith) + String(toPad)).slice(-1 * padWith.length);
}

function dateAsInputValue(toFormat) {
    if(!(toFormat instanceof Date)) return null;
    return toFormat.getFullYear() + "-" + pad(toFormat.getMonth() + 1, "00") + "-" + pad(toFormat.getDate(), "00");
}

function timeAsInputValue(toFormat) {
    if(!(toFormat instanceof Date)) return null;        
    return pad(toFormat.getHours(), "00") + ":" + pad(toFormat.getMinutes(), "00") + ":" + pad(toFormat.getSeconds(), "00");
}

Ответ 28

Если вам не нужны все функции, которые предоставляет библиотека Moment.js, вы можете использовать мой порт strftime. Он легкий (1,35 КБ против 57,9 КБ, уменьшенный по сравнению с Moment.js 2.15.0) и обеспечивает большую часть функциональности 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 answer:
 * http://stackoverflow.com/questions/8619879/javascript-calculate-the-day-of-the-year-1-366
 *
 * Week number (%V) code based on Taco van den Broek 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;
  });
}

Использование примера:

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"

Последний код доступен здесь: https://github.com/thdoan/strftime

Ответ 29

Лично, потому что я использую как PHP, так и jQuery/javascript в равных измерениях, я использую функцию даты из php.js http://phpjs.org/functions/date/

Использование библиотеки, которая использует те же строки формата, что и я уже знаю, мне проще, и руководство, содержащее все возможности строки формата для функции даты, конечно, находится в режиме онлайн на php.net

Вы просто включаете файл date.js в свой HTML, используя свой предпочтительный метод, затем вызывайте его следующим образом:

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

Вы можете использовать d1.getTime() вместо valueOf(), если хотите, они делают то же самое.

Деление на 1000 временных меток javascript связано с тем, что метка времени javascript находится в миллисекундах, но временная метка PHP находится в секундах.

Ответ 30

Многие фреймворки (которые вы уже можете использовать) имеют форматирование даты, о которых вы, возможно, и не подозреваете. jQueryUI уже упоминался, но другие структуры, такие как Kendo UI (глобализация), Yahoo UI (Util) и AngularJS имейте в виду.

// 11/6/2000
kendo.toString(new Date(value), "d")

// Monday, November 06, 2000
kendo.toString(new Date(2000, 10, 6), "D")