Формат JavaScript Дата в гггг-мм-дд
Привет всем, у меня есть формат даты Sun May 11,2014, как я могу преобразовать его в 2014-05-11 в JavaScript.
function taskDate(dateMilli) {
var d = (new Date(dateMilli) + '').split(' ');
d[2] = d[2] + ',';
return [d[0], d[1], d[2], d[3]].join(' ');
}
var datemilli = Date.parse('Sun May 11,2014');
taskdate(datemilli);
Приведенный выше код дает мне тот же формат даты ВС мая 11,2014, пожалуйста, помогите
56 ответов
Ты можешь сделать
function formatDate(date) {
var d = new Date(date),
month = '' + (d.getMonth() + 1),
day = '' + d.getDate(),
year = d.getFullYear();
if (month.length < 2) month = '0' + month;
if (day.length < 2) day = '0' + day;
return [year, month, day].join('-');
}
пример использования:
alert(formatDate('Sun May 11,2014'));
Выход:
2014-05-11
Демонстрация по скрипке: http://jsfiddle.net/abdulrauf6182012/2Frm3/
Просто используйте встроенный toISOString
метод, который переводит вашу дату в формат ISO 8601
yourDate.toISOString().split('T')[0]
где yourDate - ваш объект даты.
ОТВЕТ 2020
Вы можете использовать родной .toLocaleDateString()
функция, которая поддерживает несколько полезных параметров, таких как локаль (для выбора формата, например ММ / ДД / ГГГГ или ГГГГ / ММ / ДД), часовой пояс (для преобразования даты) и параметры подробностей форматирования (например: 1 против 01 против января).
Примеры
new Date().toLocaleDateString() // 8/19/2020
new Date().toLocaleDateString('en-US', {year: 'numeric', month: '2-digit', day: '2-digit'}); // 08/19/2020 (month and day with two digits)
new Date().toLocaleDateString('en-ZA'); // 2020/08/19 (year/month/day) notice the different locale
new Date().toLocaleString("en-US", {timeZone: "America/New_York"}); // 8/19/2020, 9:29:51 AM. (date and time in a specific timezone)
new Date().toLocaleString("en-US", {hour: '2-digit', hour12: false, timeZone: "America/New_York"}); // 09 (just the hour)
Обратите внимание, что иногда для вывода даты в желаемом формате вам нужно найти совместимый языковой стандарт с этим форматом. Вы можете найти примеры языковых стандартов здесь: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_tolocalestring_date_all
Обратите внимание, что языковой стандарт просто меняет формат, если вы хотите преобразовать конкретную дату в эквивалент времени конкретной страны или города, вам необходимо использовать параметр часового пояса.
Я использую этот способ, чтобы получить дату в формате гггг-мм-дд:)
var todayDate = new Date().toISOString().slice(0,10);
Самый простой способ конвертировать вашу дату в формат гггг-мм-дд, это сделать это:
var date = new Date("Sun May 11,2014");
var dateString = new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))
.toISOString()
.split("T")[0];
Как это устроено:
new Date("Sun May 11,2014")
преобразует строку"Sun May 11,2014"
к объекту даты, который представляет времяSun May 11 2014 00:00:00
в часовом поясе на основе текущей локали (настройки хост-системы)new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))
преобразует вашу дату в объект даты, который соответствует времениSun May 11 2014 00:00:00
в UTC (стандартное время), вычитая смещение часового пояса.toISOString()
преобразует объект даты в строку ISO 86012014-05-11T00:00:00.000Z
.split("T")
разбивает строку на массив["2014-05-11", "00:00:00.000Z"]
[0]
занимает первый элемент этого массива
демонстрация
var date = new Date("Sun May 11,2014");
var dateString = new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))
.toISOString()
.split("T")[0];
console.log(dateString);
Сочетание некоторых ответов:
var d = new Date(date);
date = [
d.getFullYear(),
('0' + (d.getMonth() + 1)).slice(-2),
('0' + d.getDate()).slice(-2)
].join('-');
format = function date2str(x, y) {
var z = {
M: x.getMonth() + 1,
d: x.getDate(),
h: x.getHours(),
m: x.getMinutes(),
s: x.getSeconds()
};
y = y.replace(/(M+|d+|h+|m+|s+)/g, function(v) {
return ((v.length > 1 ? "0" : "") + eval('z.' + v.slice(-1))).slice(-2)
});
return y.replace(/(y+)/g, function(v) {
return x.getFullYear().toString().slice(-v.length)
});
}
результат:
format(new Date('Sun May 11,2014'), 'yyyy-MM-dd')
"2014-05-11
Если у вас нет ничего против использования библиотек; Вы могли бы просто использовать библиотеку моментов.js так...
var now = new Date();
var dateString = moment(now).format('YYYY-MM-DD');
var dateStringWithTime = moment(now).format('YYYY-MM-DD HH:mm:ss');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
Вы можете использовать toLocaleDateString('fr-CA')
на Date
объект
console.log(new Date('Sun May 11,2014').toLocaleDateString('fr-CA'));
Также я обнаружил, что эти языковые стандарты дают правильный результат из этого списка языков. Список всех языков и их кратких кодов?
'en-CA'
'fr-CA'
'lt-LT'
'sv-FI'
'sv-SE'
var localesList = ["af-ZA",
"am-ET",
"ar-AE",
"ar-BH",
"ar-DZ",
"ar-EG",
"ar-IQ",
"ar-JO",
"ar-KW",
"ar-LB",
"ar-LY",
"ar-MA",
"arn-CL",
"ar-OM",
"ar-QA",
"ar-SA",
"ar-SY",
"ar-TN",
"ar-YE",
"as-IN",
"az-Cyrl-AZ",
"az-Latn-AZ",
"ba-RU",
"be-BY",
"bg-BG",
"bn-BD",
"bn-IN",
"bo-CN",
"br-FR",
"bs-Cyrl-BA",
"bs-Latn-BA",
"ca-ES",
"co-FR",
"cs-CZ",
"cy-GB",
"da-DK",
"de-AT",
"de-CH",
"de-DE",
"de-LI",
"de-LU",
"dsb-DE",
"dv-MV",
"el-GR",
"en-029",
"en-AU",
"en-BZ",
"en-CA",
"en-GB",
"en-IE",
"en-IN",
"en-JM",
"en-MY",
"en-NZ",
"en-PH",
"en-SG",
"en-TT",
"en-US",
"en-ZA",
"en-ZW",
"es-AR",
"es-BO",
"es-CL",
"es-CO",
"es-CR",
"es-DO",
"es-EC",
"es-ES",
"es-GT",
"es-HN",
"es-MX",
"es-NI",
"es-PA",
"es-PE",
"es-PR",
"es-PY",
"es-SV",
"es-US",
"es-UY",
"es-VE",
"et-EE",
"eu-ES",
"fa-IR",
"fi-FI",
"fil-PH",
"fo-FO",
"fr-BE",
"fr-CA",
"fr-CH",
"fr-FR",
"fr-LU",
"fr-MC",
"fy-NL",
"ga-IE",
"gd-GB",
"gl-ES",
"gsw-FR",
"gu-IN",
"ha-Latn-NG",
"he-IL",
"hi-IN",
"hr-BA",
"hr-HR",
"hsb-DE",
"hu-HU",
"hy-AM",
"id-ID",
"ig-NG",
"ii-CN",
"is-IS",
"it-CH",
"it-IT",
"iu-Cans-CA",
"iu-Latn-CA",
"ja-JP",
"ka-GE",
"kk-KZ",
"kl-GL",
"km-KH",
"kn-IN",
"kok-IN",
"ko-KR",
"ky-KG",
"lb-LU",
"lo-LA",
"lt-LT",
"lv-LV",
"mi-NZ",
"mk-MK",
"ml-IN",
"mn-MN",
"mn-Mong-CN",
"moh-CA",
"mr-IN",
"ms-BN",
"ms-MY",
"mt-MT",
"nb-NO",
"ne-NP",
"nl-BE",
"nl-NL",
"nn-NO",
"nso-ZA",
"oc-FR",
"or-IN",
"pa-IN",
"pl-PL",
"prs-AF",
"ps-AF",
"pt-BR",
"pt-PT",
"qut-GT",
"quz-BO",
"quz-EC",
"quz-PE",
"rm-CH",
"ro-RO",
"ru-RU",
"rw-RW",
"sah-RU",
"sa-IN",
"se-FI",
"se-NO",
"se-SE",
"si-LK",
"sk-SK",
"sl-SI",
"sma-NO",
"sma-SE",
"smj-NO",
"smj-SE",
"smn-FI",
"sms-FI",
"sq-AL",
"sr-Cyrl-BA",
"sr-Cyrl-CS",
"sr-Cyrl-ME",
"sr-Cyrl-RS",
"sr-Latn-BA",
"sr-Latn-CS",
"sr-Latn-ME",
"sr-Latn-RS",
"sv-FI",
"sv-SE",
"sw-KE",
"syr-SY",
"ta-IN",
"te-IN",
"tg-Cyrl-TJ",
"th-TH",
"tk-TM",
"tn-ZA",
"tr-TR",
"tt-RU",
"tzm-Latn-DZ",
"ug-CN",
"uk-UA",
"ur-PK",
"uz-Cyrl-UZ",
"uz-Latn-UZ",
"vi-VN",
"wo-SN",
"xh-ZA",
"yo-NG",
"zh-CN",
"zh-HK",
"zh-MO",
"zh-SG",
"zh-TW",
"zu-ZA"
];
localesList.forEach(lcl => {
if ("2014-05-11" === new Date('Sun May 11,2014').toLocaleDateString(lcl)) {
console.log(lcl, new Date('Sun May 11,2014').toLocaleDateString(lcl));
}
});
Решение 2021 года с использованием.
Новый
Intl
Объект теперь поддерживается во всех браузерах.
Вы можете выбрать формат, выбрав «локаль», в которой используется требуемый формат.
В шведской локали используется формат «гггг-мм-дд»:
// Create a date
const date = new Date(2021, 10, 28);
// Create a formatter using the "sv-SE" locale
const dateFormatter = Intl.DateTimeFormat('sv-SE');
// Use the formatter to format the date
console.log(dateFormatter.format(date)); // "2021-11-28"
Недостатки использования Intl:
- Вы не можете «неформатировать» или «разбирать» строки с помощью этого метода.
- Вы должны искать требуемый формат (например, в Википедии ) и не можете использовать строку формата, такую как "гггг-мм-дд"
Самый короткий
.toJSON().slice(0,10);
var d = new Date('Sun May 11,2014' +' UTC'); // Parse as UTC
let str = d.toJSON().slice(0,10); // Show as UTC
console.log(str);
В большинстве случаев (без обработки часовых поясов) этого достаточно:
date.toISOString().substring(0,10)
Почему бы просто не использовать это
var date = new Date('1970-01-01'); //or your date here
console.log((date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear());
Просто и мило;)
toISOString()
предполагает, что ваша дата - местное время и преобразует его в UTC. Вы получите неверную строку даты.
Следующий метод должен вернуть то, что вам нужно.
Date.prototype.yyyymmdd = function() {
var yyyy = this.getFullYear().toString();
var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based
var dd = this.getDate().toString();
return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]);
};
Источник: https://blog.justin.kelly.org.au/simple-javascript-function-to-format-the-date-as-yyyy-mm-dd/
new Date().toLocaleDateString('pt-br').split( '/' ).reverse( ).join( '-' );
или
new Date().toISOString().split('T')[0]
new Date('23/03/2020'.split('/').reverse().join('-')).toISOString()
new Date('23/03/2020'.split('/').reverse().join('-')).toISOString().split('T')[0]
Попробуй это!
function formatDate(date) {
var year = date.getFullYear().toString();
var month = (date.getMonth() + 101).toString().substring(1);
var day = (date.getDate() + 100).toString().substring(1);
return year + "-" + month + "-" + day;
}
alert(formatDate(new Date()));
const formatDate = d => [
d.getFullYear(),
(d.getMonth() + 1).toString().padStart(2, '0'),
d.getDate().toString().padStart(2, '0')
].join('-');
Вы можете использовать padstart
Когда ES2018 вращается (работает в хроме), вы можете просто использовать регулярное выражение
(new Date())
.toISOString()
.replace(
/^(?<year>\d+)-(?<month>\d+)-(?<day>\d+)T.*$/,
'$<year>-$<month>-$<day>'
)
2020-07-14
Или если вам нужно что-то довольно универсальное без каких-либо библиотек
(new Date())
.toISOString()
.match(
/^(?<yyyy>\d\d(?<yy>\d\d))-(?<mm>0?(?<m>\d+))-(?<dd>0?(?<d>\d+))T(?<HH>0?(?<H>\d+)):(?<MM>0?(?<M>\d+)):(?<SSS>(?<SS>0?(?<S>\d+))\.\d+)(?<timezone>[A-Z][\dA-Z.-:]*)$/
)
.groups
В результате получается следующее
{
H: "8"
HH: "08"
M: "45"
MM: "45"
S: "42"
SS: "42"
SSS: "42.855"
d: "14"
dd: "14"
m: "7"
mm: "07"
timezone: "Z"
yy: "20"
yyyy: "2020"
}
Что вы можете использовать так с replace(..., '$<d>/$<m>/\'$<yy> @ $<H>:$<MM>')
как наверху вместо .match(...).groups
получить
14/7/'20 @ 8:45
К сожалению, у объекта JavaScript есть много подводных камней . Любое решение на основе встроенного <tcode id="46804616"></tcode>должен связываться с часовым поясом, как обсуждалось в некоторых других ответах на этот вопрос. Чистое решение для представления даты ISO-8601 (без времени) дается <tcode id="46804617"></tcode>из предложения . Начиная с февраля 2021 года вы должны выбрать наиболее подходящий для вас обходной путь.
использовать с конкатенацией ванильных строк
Предполагая, что ваше внутреннее представление основано на, вы можете выполнить конкатенацию строк вручную. Следующий код позволяет избежать некоторых ошибок (часовой пояс, месяц с отсчетом от нуля, отсутствие двухзначного форматирования), но могут быть и другие проблемы.
function vanillaToDateOnlyIso8601() {
// month May has zero-based index 4
const date = new Date(2014, 4, 11);
const yyyy = date.getFullYear();
const mm = String(date.getMonth() + 1).padStart(2, "0"); // month is zero-based
const dd = String(date.getDate()).padStart(2, "0");
if (yyyy < 1583) {
// TODO: decide how to support dates before 1583
throw new Error(`dates before year 1583 are not supported`);
}
const formatted = `${yyyy}-${mm}-${dd}`;
console.log("vanilla", formatted);
}
использовать со вспомогательной библиотекой (например, <tcode id="46804624"></tcode>из )
Это популярный подход, но вы все равно вынуждены обрабатывать календарную дату как <tcode id="46804614"></tcode>, который представляет
единый момент времени в независимом от платформы формате
Однако следующий код должен выполнить свою работу:
import { formatISO } from "date-fns";
function dateFnsToDateOnlyIso8601() {
// month May has zero-based index 4
const date = new Date(2014, 4, 11);
const formatted = formatISO(date, { representation: "date" });
console.log("date-fns", formatted);
}
найти библиотеку, которая правильно представляет дату и время
Хотелось бы, чтобы была чистая и проверенная в боях библиотека, которая имеет собственные хорошо продуманные представления даты и времени. Перспективным кандидатом на поставленную задачу в этом вопросе был
<tcode id="46804628"></tcode> из
<tcode id="46804629"></tcode>, но библиотека менее активна, чем, скажем,
date-fns
. Когда я играл с некоторым примером кода, у меня также были некоторые проблемы после добавления необязательного
@js-joda/timezone
.
Однако основные функции работают и кажутся мне очень понятными:
import { LocalDate, Month } from "@js-joda/core";
function jodaDateOnlyIso8601() {
const someDay = LocalDate.of(2014, Month.MAY, 11);
const formatted = someDay.toString();
console.log("joda", formatted);
}
экспериментируйте с <tcode id="46804618"></tcode>-предложение полифилл
Это не рекомендуется для производства, но вы можете импортировать будущее, если хотите:
import { Temporal } from "proposal-temporal";
function temporalDateOnlyIso8601() {
// yep, month is one-based here (as of Feb 2021)
const plainDate = new Temporal.PlainDate(2014, 5, 11);
const formatted = plainDate.toString();
console.log("proposal-temporal", formatted);
}
Вы можете попробовать это: https://www.npmjs.com/package/timesolver
npm i timesolver
используйте это в своем коде:
const timeSolver = require('timeSolver');
const date = new Date();
const dateString = timeSolver.getString(date, "YYYY-MM-DD");
Вы можете получить строку даты, используя этот метод:
GetString
Надеюсь, что это поможет вам!
Чтобы учесть часовой пояс, этот лайнер должен быть хорош без какой-либо библиотеки:
new Date().toLocaleString("en-IN", {timeZone: "Asia/Kolkata"}).split(',')[0]
Я предлагаю использовать что-то вроде этого https://github.com/brightbits/formatDate-js вместо того, чтобы пытаться реплицировать это каждый раз, просто используйте библиотеку, которая поддерживает все основные действия strftime.
new Date().format("%Y-%m-%d")
Вот один из способов сделать это:
var date = Date.parse('Sun May 11,2014');
function format(date) {
date = new Date(date);
var day = ('0' + date.getDate()).slice(-2);
var month = ('0' + (date.getMonth() + 1)).slice(-2);
var year = date.getFullYear();
return year + '-' + month + '-' + day;
}
console.log(format(date));
Предупреждение: этот код не работает в некоторых версиях Chrome, Node.js и т. д.
- Ожидал:
yyyy-MM-dd
- Действительный:
M/d/yyyy
Рекомендации
- https://github.com/nodejs/node/issues/46277
- https://github.com/nodejs/node/issues/45945
- https://unicode-org.atlassian.net/browse/CLDR-16399
- https://bugs.chromium.org/p/chromium/issues/detail?id=1418727
Пожалуйста, учитывайте часовые пояса при конвертацииDate
строка даты.
Можно использовать два метода.
-
.toISOString();
- Исправлено время GMT+0. Включает время, которое позже необходимо удалить. -
.toLocaleDateString('en-CA');
- Часовой пояс может быть указан. По умолчанию системный.
Обратите внимание, чтоen-CA
это локаль, а не часовой пояс. Канада используетYYYY-MM-DD
формат.
В следующем примере системный часовой пояс установлен на PDT (GMT-7).
const date = new Date('2023-04-08 GMT+09:00');
// Sat Apr 08 2023 00:00:00 GMT+0900 (한국 표준시)
// Fri Apr 07 2023 08:00:00 GMT-0700 (Pacific Daylight Time)
// Based on GMT+0 or UTC - time is substringed.
date.toISOString(); // '2023-04-07T15:00:00.000Z'
date.toISOString().substring(0, 10); // '2023-04-07'
// Based on GMT-7 - local timezone of the system
date.toLocaleDateString('en-CA'); // '2023-04-07'
// Based on GMT+9 - Asia/Seoul is GMT+9
date.toLocaleDateString('en-CA', { timeZone: 'Asia/Seoul' }); // '2023-04-08'
Date.js отлично подходит для этого.
require("datejs")
(new Date()).toString("yyyy-MM-dd")
Вы можете использовать эту функцию для лучшего формата и простоты использования:
function convert(date) {
const d = Date.parse(date)
const date_obj = new Date(d)
return `${date_obj.getFullYear()}-${date_obj.toLocaleString("default", { month: "2-digit" })}-${date_obj.toLocaleString("default", { day: "2-digit"})}`
}
Эта функция будет форматировать месяц как 2-значный вывод, а также дни
Ни один из этих ответов не удовлетворил меня. Я хотел кроссплатформенное решение, которое дает мне день в местном часовом поясе без использования каких-либо внешних библиотек.
Вот что я придумал:
function localDay(time) {
var minutesOffset = time.getTimezoneOffset()
var millisecondsOffset = minutesOffset*60*1000
var local = new Date(time - millisecondsOffset)
return local.toISOString().substr(0, 10)
}
Это должно вернуть день даты, в формате ГГГГ-ММ-ДД, в часовом поясе с указанием даты.
Так например localDay(new Date("2017-08-24T03:29:22.099Z"))
вернусь "2017-08-23"
хотя это уже 24-е в UTC.
Вам нужно будет заполнить Date.prototype.toISOString, чтобы он работал в IE8, но он должен поддерживаться везде.
Некоторые из них выше были в порядке - но не были очень гибкими. Я хотел что-то, что действительно могло бы справиться с большим количеством крайних случаев, поэтому я взял ответ @orangleliu и расширил его. https://jsfiddle.net/8904cmLd/1/
function DateToString(inDate, formatString) {
// Written by m1m1k 2018-04-05
// Validate that we're working with a date
if(!isValidDate(inDate))
{
inDate = new Date(inDate);
}
// see the jsFiddle for extra code to be able to use DateToString('Sun May 11,2014','USA');
//formatString = CountryCodeToDateFormat(formatString);
var dateObject = {
M: inDate.getMonth() + 1,
d: inDate.getDate(),
D: inDate.getDate(),
h: inDate.getHours(),
m: inDate.getMinutes(),
s: inDate.getSeconds(),
y: inDate.getFullYear(),
Y: inDate.getFullYear()
};
// Build Regex Dynamically based on the list above.
// Should end up with something like this "/([Yy]+|M+|[Dd]+|h+|m+|s+)/g"
var dateMatchRegex = joinObj(dateObject, "+|") + "+";
var regEx = new RegExp(dateMatchRegex,"g");
formatString = formatString.replace(regEx, function(formatToken) {
var datePartValue = dateObject[formatToken.slice(-1)];
var tokenLength = formatToken.length;
// A conflict exists between specifying 'd' for no zero pad -> expand to '10' and specifying yy for just two year digits '01' instead of '2001'. One expands, the other contracts.
// so Constrict Years but Expand All Else
if(formatToken.indexOf('y') < 0 && formatToken.indexOf('Y') < 0)
{
// Expand single digit format token 'd' to multi digit value '10' when needed
var tokenLength = Math.max(formatToken.length, datePartValue.toString().length);
}
var zeroPad = (datePartValue.toString().length < formatToken.length ? "0".repeat(tokenLength) : "");
return (zeroPad + datePartValue).slice(-tokenLength);
});
return formatString;
}
Пример использования:
DateToString('Sun May 11,2014', 'MM/DD/yy');
DateToString('Sun May 11,2014', 'yyyy.MM.dd');
DateToString(new Date('Sun Dec 11,2014'),'yy-M-d');
Если вы используете momentjs
, теперь они включают константу для этого формата YYYY-MM-DD
:
date.format(moment.HTML5_FMT.DATE)