Поиск…


Синтаксис

  • новая дата ();
  • новая дата (значение);
  • новая дата (dateAsString);
  • новая дата (год, месяц [, день [, час [, минута [, секунда [, миллисекунда]]]]]);

параметры

параметр подробности
value Число миллисекунд с 1 января 1970 года 00: 00: 00.000 UTC (эпоха Unix)
dateAsString Дата, отформатированная как строка (см. Примеры для получения дополнительной информации)
year Значение года. Обратите внимание, что month также должен быть предоставлен, или значение будет интерпретироваться как количество миллисекунд. Также обратите внимание, что значения от 0 до 99 имеют особое значение. См. Примеры.
month Месяц, в диапазоне 0-11 . Обратите внимание, что использование значений за пределами указанного диапазона для этого и следующих параметров не приведет к ошибке, а скорее приведет к тому, что результирующая дата «перевернется» к следующему значению. См. Примеры.
day Необязательно: дата в диапазоне 1-31 .
hour Дополнительно: час, в диапазоне 0-23 .
minute Дополнительно: минута, в диапазоне 0-59 .
second Дополнительно: второй, в диапазоне 0-59 .
millisecond Дополнительно: миллисекунда, в диапазоне 0-999 .

Получить текущее время и дату

Используйте new Date() для создания нового объекта Date содержащего текущую дату и время.

Обратите внимание, что Date() вызываемая без аргументов, эквивалентна new Date(Date.now()) .

Когда у вас есть объект даты, вы можете применить любой из нескольких доступных методов для извлечения его свойств (например, getFullYear() чтобы получить 4-значный год).

Ниже приведены некоторые общие методы даты.

Получить текущий год

var year = (new Date()).getFullYear();
console.log(year);
// Sample output: 2016 

Получить текущий месяц

var month = (new Date()).getMonth();
console.log(month);
// Sample output: 0 

Обратите внимание, что 0 = январь. Это потому, что месяцы варьируются от 0 до 11 , поэтому часто желательно добавить +1 к индексу.

Получить текущий день

var day = (new Date()).getDate();
console.log(day);
// Sample output: 31

Получить текущий час

var hours = (new Date()).getHours();
console.log(hours);
// Sample output: 10

Получить текущие минуты

var minutes = (new Date()).getMinutes();
console.log(minutes);
// Sample output: 39

Получить текущие секунды

var seconds = (new Date()).getSeconds();
console.log(second);
// Sample output: 48

Получить текущие миллисекунды

Чтобы получить миллисекунды (от 0 до 999) экземпляра объекта Date , используйте метод getMilliseconds .

var milliseconds = (new Date()).getMilliseconds();
console.log(milliseconds);
 // Output: milliseconds right now

Преобразование текущего времени и даты в удобочитаемую строку

var now = new Date();
// convert date to a string in UTC timezone format:
console.log(now.toUTCString());
// Output: Wed, 21 Jun 2017 09:13:01 GMT

Статический метод Date.now() возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 по UTC. Чтобы получить количество миллисекунд, прошедших с того времени, используя экземпляр объекта Date , используйте его метод getTime .

// get milliseconds using static method now of Date
console.log(Date.now());

// get milliseconds using method getTime of Date instance
console.log((new Date()).getTime());

Создать новый объект Date

Чтобы создать новый объект Date используйте конструктор Date() :

  • без аргументов

    Date() создает экземпляр Date содержащий текущее время (до миллисекунды) и дату.

  • с одним целым аргументом

    Date(m) создает экземпляр Date содержащий время и дату, соответствующие времени Epoch (1 января 1970 UTC) плюс m миллисекунд. Пример: new Date(749019369738) дает дату Sun, 26 Sep 1993 04:56:09 GMT .

  • с аргументом строки

    Date(dateString) возвращает объект Date который возникает после разбора dateString с помощью Date.parse .

  • с двумя или более целыми аргументами

    Date(i1, i2, i3, i4, i5, i6) считывает аргументы как год, месяц, день, часы, минуты, секунды, миллисекунды и создает экземпляр соответствующего объекта Date . Обратите внимание, что месяц индексируется 0 в JavaScript, поэтому 0 означает январь и 11 означает декабрь. Пример: new Date(2017, 5, 1) выдается 1 июня 2017 года .


Изучение дат

Обратите внимание, что эти примеры были созданы в браузере в Центральном часовом поясе США во время дневного времени, о чем свидетельствует код. Если сравнение с UTC было поучительным, Date.prototype.toISOString() использовался для отображения даты и времени в UTC (Z в форматированной строке обозначает UTC).

// Creates a Date object with the current date and time from the 
// user's browser
var now = new Date();
now.toString() === 'Mon Apr 11 2016 16:10:41 GMT-0500 (Central Daylight Time)' 
// true
// well, at the time of this writing, anyway

// Creates a Date object at the Unix Epoch (i.e., '1970-01-01T00:00:00.000Z')
var epoch = new Date(0);
epoch.toISOString() === '1970-01-01T00:00:00.000Z' // true

// Creates a Date object with the date and time 2,012 milliseconds 
// after the Unix Epoch (i.e., '1970-01-01T00:00:02.012Z').
var ms = new Date(2012); 
date2012.toISOString() === '1970-01-01T00:00:02.012Z' // true

// Creates a Date object with the first day of February of the year 2012 
// in the local timezone.
var one = new Date(2012, 1);
one.toString() === 'Wed Feb 01 2012 00:00:00 GMT-0600 (Central Standard Time)' 
// true

// Creates a Date object with the first day of the year 2012 in the local 
// timezone.
// (Months are zero-based) 
var zero = new Date(2012, 0);
zero.toString() === 'Sun Jan 01 2012 00:00:00 GMT-0600 (Central Standard Time)' 
// true

// Creates a Date object with the first day of the year 2012, in UTC.
var utc = new Date(Date.UTC(2012, 0));
utc.toString() === 'Sat Dec 31 2011 18:00:00 GMT-0600 (Central Standard Time)'
// true
utc.toISOString() === '2012-01-01T00:00:00.000Z'
// true

// Parses a string into a Date object (ISO 8601 format added in ECMAScript 5.1)
// Implementations should assumed UTC because of ISO 8601 format and Z designation
var iso = new Date('2012-01-01T00:00:00.000Z');
iso.toISOString() === '2012-01-01T00:00:00.000Z' // true

// Parses a string into a Date object (RFC in JavaScript 1.0)
var local = new Date('Sun, 01 Jan 2012 00:00:00 -0600');
local.toString() === 'Sun Jan 01 2012 00:00:00 GMT-0600 (Central Standard Time)'
// true

// Parses a string in no particular format, most of the time. Note that parsing
// logic in these cases is very implementation-dependent, and therefore can vary
// across browsers and versions.
var anything = new Date('11/12/2012'); 
anything.toString() === 'Mon Nov 12 2012 00:00:00 GMT-0600 (Central Standard Time)'
// true, in Chrome 49 64-bit on Windows 10 in the en-US locale. Other versions in 
// other locales may get a different result.

// Rolls values outside of a specified range to the next value.
var rollover = new Date(2012, 12, 32, 25, 62, 62, 1023);
rollover.toString() === 'Sat Feb 02 2013 02:03:03 GMT-0600 (Central Standard Time)'
// true; note that the month rolled over to Feb; first the month rolled over to 
// Jan based on the month 12 (11 being December), then again because of the day 32
// (January having 31 days).

// Special dates for years in the range 0-99
var special1 = new Date(12, 0);
special1.toString() === 'Mon Jan 01 1912 00:00:00 GMT-0600 (Central Standard Time)`
// true

// If you actually wanted to set the year to the year 12 CE, you'd need to use the
// setFullYear() method:
special1.setFullYear(12);
special1.toString() === 'Sun Jan 01   12 00:00:00 GMT-0600 (Central Standard Time)`
// true

Конвертировать в JSON

var date1 = new Date();
date1.toJSON();

Возвращает: «2016-04-14T23: 49: 08.596Z»

Создание даты с UTC

По умолчанию объект Date создается как локальное время. Это не всегда желательно, например, при передаче даты между сервером и клиентом, которые не находятся в одном и том же часовом поясе. В этом случае никто не хочет беспокоиться о часовых поясах вообще, пока дата не должна отображаться в локальное время, если это вообще требуется.

Эта проблема

В этой задаче мы хотим сообщить конкретную дату (день, месяц, год) кому-то в другой часовой пояс. Первая реализация наивно использует местное время, что приводит к неправильным результатам. Вторая реализация использует даты UTC, чтобы избежать часовых поясов, где они не нужны.

Наивный подход с результатами WRONG

function formatDate(dayOfWeek, day, month, year) {
  var daysOfWeek = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
  var months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
  return daysOfWeek[dayOfWeek] + " " + months[month] + " " + day + " " + year;
}

//Foo lives in a country with timezone GMT + 1
var birthday = new Date(2000,0,1);
console.log("Foo was born on: " + formatDate(birthday.getDay(), birthday.getDate(),
      birthday.getMonth(), birthday.getFullYear()));

sendToBar(birthday.getTime());

Пример вывода: Foo was born on: Sat Jan 1 2000

//Meanwhile somewhere else...

//Bar lives in a country with timezone GMT - 1
var birthday = new Date(receiveFromFoo());
console.log("Foo was born on: " + formatDate(birthday.getDay(), birthday.getDate(),
      birthday.getMonth(), birthday.getFullYear()));

Образец вывода: Foo was born on: Fri Dec 31 1999

И таким образом, Бар всегда верит, что Foo родился в последний день 1999 года.

Правильный подход

function formatDate(dayOfWeek, day, month, year) {
  var daysOfWeek = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
  var months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
  return daysOfWeek[dayOfWeek] + " " + months[month] + " " + day + " " + year;
}

//Foo lives in a country with timezone GMT + 1
var birthday = new Date(Date.UTC(2000,0,1));
console.log("Foo was born on: " + formatDate(birthday.getUTCDay(), birthday.getUTCDate(),
      birthday.getUTCMonth(), birthday.getUTCFullYear()));

sendToBar(birthday.getTime());

Пример вывода: Foo was born on: Sat Jan 1 2000

//Meanwhile somewhere else...

//Bar lives in a country with timezone GMT - 1
var birthday = new Date(receiveFromFoo());
console.log("Foo was born on: " + formatDate(birthday.getUTCDay(), birthday.getUTCDate(), 
      birthday.getUTCMonth(), birthday.getUTCFullYear()));

Пример вывода: Foo was born on: Sat Jan 1 2000

Создание даты с UTC

Если вы хотите создать объект Date на основе UTC или GMT, можно использовать метод Date.UTC(...) . Он использует те же аргументы, что и самый длинный конструктор Date . Этот метод вернет число, представляющее время, прошедшее с 1 января 1970 года, 00:00:00 по UTC.

console.log(Date.UTC(2000,0,31,12));

Пример вывода: 949320000000

var utcDate = new Date(Date.UTC(2000,0,31,12));
console.log(utcDate);

Образец вывода: Mon Jan 31 2000 13:00:00 GMT+0100 (West-Europa (standaardtijd))

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

var utcDate = new Date(Date.UTC(2000,0,31,12));
var localDate = new Date(2000,0,31,12);

console.log(localDate - utcDate === utcDate.getTimezoneOffset() * 60 * 1000);

Пример вывода: true

Изменение объекта Date

Все модификаторы объекта Date , такие как setDate(...) и setFullYear(...) имеют эквивалент, принимают аргумент в UTC, а не в локальное время.

var date = new Date();
date.setUTCFullYear(2000,0,31);
date.setUTCHours(12,0,0,0);
console.log(date);

Образец вывода: Mon Jan 31 2000 13:00:00 GMT+0100 (West-Europa (standaardtijd))

Другими модификаторами UTC являются .setUTCMonth() , .setUTCDate() (для дня месяца), .setUTCMinutes() , .setUTCSeconds() и .setUTCMilliseconds() .

Избегая двусмысленности с getTime () и setTime ()

Если вышеприведенные методы должны различать двусмысленность в датах, обычно проще сообщить дату как время, прошедшее с 1 января 1970 года, 00:00:00 по UTC. Это единственное число представляет собой единую точку во времени и может быть преобразовано в локальное время, когда это необходимо.

var date = new Date(Date.UTC(2000,0,31,12));
var timestamp = date.getTime();
//Alternatively
var timestamp2 = Date.UTC(2000,0,31,12);
console.log(timestamp === timestamp2);

Пример вывода: true

//And when constructing a date from it elsewhere...
var otherDate = new Date(timestamp);

//Represented as an universal date
console.log(otherDate.toUTCString());
//Represented as a local date
console.log(otherDate);

Пример вывода:

Mon, 31 Jan 2000 12:00:00 GMT
Mon Jan 31 2000 13:00:00 GMT+0100 (West-Europa (standaardtijd))

Преобразование в строковый формат

Преобразовать в строку

var date1 = new Date();
date1.toString();

Возвращает: «Пт 15 апреля 2016 07:48:48 GMT-0400 (Восточное дневное время)»


Преобразование в строку времени

var date1 = new Date();
date1.toTimeString();

Возвращает: «07:48:48 GMT-0400 (Восточное дневное время)»


Преобразование в строку даты

var date1 = new Date();
date1.toDateString();

Возврат: «Чт 14 апр 2016»


Преобразование в строку UTC

var date1 = new Date();
date1.toUTCString();

Возвращает: «Пт, 15 апр 2016 11:48:48 GMT»


Преобразование в строку ISO

var date1 = new Date();
date1.toISOString();

Возвращает: «2016-04-14T23: 49: 08.596Z»


Преобразовать в GMT String

var date1 = new Date();
date1.toGMTString();

Возвращает: «Чт, 14 апр 2016 23:49:08 GMT»

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


Преобразовать в строку даты локали

var date1 = new Date();
date1.toLocaleDateString();

Возврат: "4/14/2016"

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

date1.toLocaleDateString([locales [, options]])

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

date1.toLocaleDateString(["zh", "en-US"]);

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

var options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
date1.toLocaleDateString([], options);

приведет к

«Четверг, 14 апреля 2016 года».

Более подробную информацию см. В MDN .

Увеличение объекта даты

Чтобы увеличить объекты даты в Javascript, мы обычно можем это сделать:

var checkoutDate = new Date();    // Thu Jul 21 2016 10:05:13 GMT-0400 (EDT)

checkoutDate.setDate( checkoutDate.getDate() + 1 );

console.log(checkoutDate); // Fri Jul 22 2016 10:05:13 GMT-0400 (EDT)

Можно использовать setDate для изменения даты на день в следующем месяце, используя значение, большее, чем количество дней в текущем месяце -

var checkoutDate = new Date();    // Thu Jul 21 2016 10:05:13 GMT-0400 (EDT)
checkoutDate.setDate( checkoutDate.getDate() + 12 );
console.log(checkoutDate); // Tue Aug 02 2016 10:05:13 GMT-0400 (EDT)

То же самое относится к другим методам, таким как getHours (), getMonth () и т. Д.

Добавление рабочих дней

Если вы хотите добавить рабочие дни (в этом случае я setDate понедельника по пятницу), вы можете использовать функцию setDate хотя вам нужна небольшая дополнительная логика для учета выходных дней (очевидно, это не учитывает национальные праздники) -

function addWorkDays(startDate, days) {
    // Get the day of the week as a number (0 = Sunday, 1 = Monday, .... 6 = Saturday)
    var dow = startDate.getDay();
    var daysToAdd = days;
    // If the current day is Sunday add one day
    if (dow == 0)
        daysToAdd++;
    // If the start date plus the additional days falls on or after the closest Saturday calculate weekends
    if (dow + daysToAdd >= 6) {
        //Subtract days in current working week from work days
        var remainingWorkDays = daysToAdd - (5 - dow);
        //Add current working week's weekend
        daysToAdd += 2;
        if (remainingWorkDays > 5) {
            //Add two days for each working week by calculating how many weeks are included
            daysToAdd += 2 * Math.floor(remainingWorkDays / 5);
            //Exclude final weekend if remainingWorkDays resolves to an exact number of weeks
            if (remainingWorkDays % 5 == 0)
                daysToAdd -= 2;
        }
    }
    startDate.setDate(startDate.getDate() + daysToAdd);
    return startDate;
}

Получить количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 UTC

Статический метод Date.now возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 по UTC. Чтобы получить количество миллисекунд, прошедших с того времени, используя экземпляр объекта Date , используйте его метод getTime .

// get milliseconds using static method now of Date
console.log(Date.now());

// get milliseconds using method getTime of Date instance
console.log((new Date()).getTime());

Форматирование даты JavaScript

Форматирование даты JavaScript в современных браузерах

В современных браузерах (*) Date.prototype.toLocaleDateString() позволяет вам определять форматирование Date удобным образом.

Он требует следующего формата:

dateObj.toLocaleDateString([locales [, options]])

Параметр locales должен быть строкой с тегом языка BCP 47 или массивом таких строк.

Параметр options должен быть объектом с некоторыми или всеми из следующих свойств:

  • localeMatcher : возможные значения: "lookup" и "best fit" ; по умолчанию "best fit"
  • timeZone : единственные значения, которые должны быть реализованы, - это "UTC" ; по умолчанию используется временной диапазон времени выполнения
  • hour12 : возможные значения: true и false ; значение по умолчанию зависит от языка
  • formatMatcher : возможные значения являются "basic" и "best fit" ; по умолчанию "best fit"
  • будний день : возможные значения "narrow" , "short" и "long"
  • эпоха : возможные значения "narrow" , "short" и "long"
  • год : возможные значения: "numeric" и "2-digit"
  • месяц : возможные значения: "numeric" , "2-digit" , "narrow" , "short" и "long"
  • день : возможные значения: "numeric" и "2-digit"
  • час : возможные значения являются "numeric" и "2-digit"
  • минута : возможные значения: "numeric" и "2-digit"
  • во-вторых : возможные значения: "numeric" и "2-digit"
  • timeZoneName : возможные значения: "short" & "long"

Как пользоваться

var today = new Date().toLocaleDateString('en-GB', {  
    day : 'numeric',
    month : 'short',
    year : 'numeric'
});

Вывод, если он исполняется 24 января 2036 года:

'24 Jan 2036'

Переход на заказ

Если Date.prototype.toLocaleDateString() недостаточно гибко, чтобы выполнить любую необходимую вам потребность, возможно, вам стоит подумать о создании настраиваемого объекта Date, который выглядит следующим образом:

var DateObject = (function() {
    var monthNames = [
      "January", "February", "March",
      "April", "May", "June", "July",
      "August", "September", "October",
      "November", "December"
    ];
    var date = function(str) {
        this.set(str);
    };
    date.prototype = {
        set : function(str) {
            var dateDef = str ? new Date(str) : new Date();
            this.day = dateDef.getDate();
            this.dayPadded = (this.day < 10) ? ("0" + this.day) : "" + this.day;
            this.month = dateDef.getMonth() + 1;
            this.monthPadded = (this.month < 10) ? ("0" + this.month) : "" + this.month;
            this.monthName = monthNames[this.month - 1];
            this.year = dateDef.getFullYear();
        },
        get : function(properties, separator) {
            var separator = separator ? separator : '-'
                ret = [];
            for(var i in properties) {
                ret.push(this[properties[i]]);
            }
            return ret.join(separator);
        }
    };
    return date;
})();

Если вы включили этот код и выполнили new DateObject() 20 января 2019 года, он создаст объект со следующими свойствами:

day: 20
dayPadded: "20"
month: 1
monthPadded: "01"
monthName: "January"
year: 2019

Чтобы получить форматированную строку, вы можете сделать что-то вроде этого:

new DateObject().get(['dayPadded', 'monthPadded', 'year']);

Это даст следующий результат:

20-01-2016

(*) Согласно MDN , «современные браузеры» означает Chrome 24+, Firefox 29+, IE11, Edge12 +, Opera 15+ и Safari ночной сборки



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow