JavaScriptの日付をyyyy-mm-ddとしてフォーマットします


382

形式の日付がありますSun May 11,20142014-05-11JavaScript に変換するにはどうすればよいですか?

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');
console.log(taskDate(datemilli));

上記のコードでは、同じ日付形式が得られますsun may 11,2014。どうすれば修正できますか?


7
上記のコードが構文エラー以外のものを与えるとは思えません。
plalx 2014年

Moment.jsのようなライブラリの使用を検討してください。それは望ましい結果でフォーマットされます:)
Ankur 2016年

5
5行のコードで作業できるのに、なぜライブラリを使用するのですか?@Ankur
ブラックマンバ


関連:JavaScriptで有効な日時文字列とは何ですか?「2014年5月11日」は有効な日付文字列ではないため、ブラウザによっては解析に失敗する場合があります。
str

回答:


524

できるよ:

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

JSFiddleのデモ:http ://jsfiddle.net/abdulrauf6182012/2Frm3/


11
同じステートメントで実際に複数の変数宣言はありますか?stackoverflow.com/questions/694102/…–
bhspencer

8
@ Fuser97381同じステートメント内の複数の変数宣言は、単なる美的スタイルの好み以上のものです。危険な行為です。誤って失敗した場合は、各宣言の後にカンマを追加すると、最終的にグローバル変数が作成されます。質問に対する標準的な回答になる可能性があることについて奨励されるべきものではありません。
bhspencer 2015

6
'use strict';@bhspencer
Vix

3
日付文字列の再フォーマットは、組み込みのパーサーによる非標準文字列の正常な解析に依存するべきではありません。OPフォーマットがあれば、Dateをまったく使用せずに、より少ないコードで再フォーマットできます。
RobG 2017年

1〜31の範囲で30日をさらに増やすにはどうすればよいですか?
Steve Angello

456

toISOString日付をISO 8601形式にする組み込みの方法を活用するだけです。

yourDate.toISOString().split('T')[0]

yourDateは日付オブジェクトです。

編集:誰かがコメントでタイムゾーンを処理するためにこれを書いた:

const offset = yourDate.getTimezoneOffset()
yourDate = new Date(yourDate.getTime() + (offset*60*1000))
return yourDate.toISOString().split('T')[0]

238
最初に日付をUTCに変換するため、このメソッドには注意してください。+タイムゾーンにいて、時間の部分がその日の早い場合、1日ロールバックする可能性があります。または、タイムゾーンにいて、時間の部分が1日の遅れている場合は、1日進む可能性があります。
Luke Baulch、2015

4
代わりにこれを試してください:new Date(yourDateStr).toISOString().split('T')[0]
exbuddha

24
const offset = yourDate.getTimezoneOffset(); yourDate = new Date(yourDate.getTime() + (offset*60*1000)); yourDate.toISOString().split('T')[0] これはタイムゾーンの問題を解決するはずです
mjwrazor 2018

5
now.toISOString().substring(0,10);YYYY-MM-DD完全なiso形式の最初の10文字である ことを思い出させるので、これはより
すっきりした代替案

4
注:@mjwrazorでコメント役立つソリューションを使用して、私は引く代わりに追加する必要がありました正しい日付(変更を取得するためにオフセット+ (offsetする- (offset
ロココ

135

この方法を使用して、yyyy-mm-dd形式の日付を取得します。

var todayDate = new Date().toISOString().slice(0,10);

14
ここで@Luke_Baulchが述べたように、日付の切り替えを1日ごとにどのように処理しますか
Malvineous 2016

7
これを行うことができます:var todayDate = new Date(); todayDate.setMinutes(todayDate.getMinutes()-todayDate.getTimezoneOffset()); todayDate.toISOString()。slice(0,10); これにより、UTCの問題を回避できます。
Fernando Aguilar

1
@FernandoAguilar疑いの余地はありますが、オフセットを差し引いたり追加したりする必要があることをどのようにして知ることができますか?
whyAto8 2017

var todayDate = new Date(2018, 3 - 1, 26); todayDate.toISOString().slice(0, 10);くれ"2018-03-25"ます。別のシステムでvar todayDate = new Date(2018, 3 - 1, 26, 17, 0, 0); todayDate.toISOString().slice(0, 10);は私に与えます"2018-03-27"
Salman A

2
常に機能するとは限りません。UTC変換により、1日が差し引かれる場合があります。
NickG

110

日付をyyyy-mm-dd形式に変換する最も簡単な方法は、次のようにすることです。

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 8601文字列に変換します 2014-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);


20
これが最も簡単な方法であることに誰もが驚きませんか?
ギャップ

.toISOString()は、夏時間では正しく機能しません。
ジョーのアイデア

2
@JoeDevmon:それがここでどのように関連しているかはわかりません。- (date.getTimezoneOffset() * 60000 )ビットは、夏時間の影響を含む任意のタイムゾーンの違いを排除すべきです。
John Slegers

2
@JohnSlegersは私が考えていたものですが、場合によっては前日にまだ取得していました。私はリファクタリングし、あなたの例は今動作します。変な日付文字列か何かがあったに違いない。それに固執し、それを指摘してくれてありがとう。1👍
ジョーのアイデア

2
私は、SOや他のサイト全体でハイとローを検索して、JSの日付に関するタイムゾーンの問題に対処するための最良の方法を見つけました。ありがとうございました!
HartleySan

34
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

1
このソリューションがこの質問に対する他の回答よりも優れているという柔軟性が気に入っています。私はこれを完全にテストしていませんが、希望する形式(つまり、「yyyy-MM-dd hh:mm:ss」)の場合、期待どおりに機能します。
porcus

3
あなたは簡単に避けることができevalます。
Salman A

3
これは、evalを回避してコメントを改善したバージョンですjsfiddle.net/8904cmLd/2
m1m1k

2
私はこの反応から恩恵を受けました。その行をevalステートメントに置き換えましたreturn ((v.length > 1 ? "0" : "") + z[v.slice(-1)]).slice(-2);
JesusIsMyDriver.dll

26

いくつかの答えの組み合わせ:

var d = new Date(date);
date = [
  d.getFullYear(),
  ('0' + (d.getMonth() + 1)).slice(-2),
  ('0' + d.getDate()).slice(-2)
].join('-');

私はこのソリューションが一番好きです-読みやすく、toISOString()その機能を使用することによる潜在的なタイムゾーンの落とし穴に依存しません。
matt.fc

これは私の脳を傷つけない最初のものです。
ckapilla

22

ライブラリを使用することに何も問題がない場合は、次のようにMoments.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>


クールなソリューションですが、300kbパッケージ
アダム

13

単にこれを使用してください:

var date = new Date('1970-01-01'); // Or your date here
console.log((date.getMonth() + 1) + '/' + date.getDate() + '/' +  date.getFullYear());

シンプルで甘い;)


4
2文字形式の場合、パディングはありません。日付または月が10未満の場合は1桁で表示されるため、これを直接使用することはできません。
Yatender Singh 2017

はい、しかしそれは単にJavaScriptを使用して達成することができます、それは完全にあなたの要件まで完全に私がそう思うでしょうね?@YatenderSingh
Pardeep Jain

4
そうですが、質問のタイトル「yyyy-mm-dd」のタイトルを確認してください:)
Yatender Singh 2017

var old_date = new Date(date); var new_date = old_date.getFullYear()+ '-' +(old_date.getMonth()+ 1)+ '-' + old_date.getDate()
Sitti Munirah Abdul Razak

1
すごい。それは機能し、シンプルで簡潔でした!
Waleed93

12

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/


9

年、月、日を取得し、それらを組み合わせます。ストレート、シンプル、正確。

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;
}

//Usage example:
alert(formatDate(new Date()));


8

あなたは使用することができます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'


すべてのアイデア、なぜこの作品?ISO形式はデフォルトのみですか、それともこれらのロケールは本当にその形式を使用していますか?前者の場合、将来的に予期せず変更される可能性があることを懸念します。
jymbob

THisはブラウザの外でNodeJSを使用していません。
Donato

@jymbobこれらのロケールは本当にこれらのフォーマットを使用していると思います。Iましたが、このWikipediaのページを見て、同じ答えに来た:en.wikipedia.org/wiki/Date_format_by_country
シプリアンTomoiagă

5

タイムゾーンも考慮すると、このワンライナーはライブラリなしで良いはずです:

new Date().toLocaleString("en-IN", {timeZone: "Asia/Kolkata"}).split(',')[0]

5

あなたはこれを試すことができます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

4

これらの答えはどれも私をかなり満足させませんでした。外部ライブラリを使用せずにローカルタイムゾーンで1日を過ごせるクロスプラットフォームソリューションが必要でした。

これは私が思いついたものです:

function localDay(time) {
  var minutesOffset = time.getTimezoneOffset()
  var millisecondsOffset = minutesOffset*60*1000
  var local = new Date(time - millisecondsOffset)
  return local.toISOString().substr(0, 10)
}

これにより、日付が参照するタイムゾーンで日付の日がYYYY-MM-DD形式で返されます。

したがって、たとえば、UTCで既に24日であっても、localDay(new Date("2017-08-24T03:29:22.099Z"))は戻り"2017-08-23"ます。

Internet Explorer 8で機能させるには、Date.prototype.toISOStringをポリフィルする必要がありますが、他のすべての場所でサポートされている必要があります。


あなたがUTC(例えば、米国)に十分遅れている場合にのみ2017-08-23を与えることは注目に値します。
Simon D

3

毎回複製するのではなく、formatDate-jsのようなものを使用することをお勧めします。すべての主要なstrftimeアクションをサポートするライブラリを使用してください。

new Date().format("%Y-%m-%d")

3
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]

これを試して!


2番目のオプションは、UTCタイムゾーンでデータを表示するため、誤った日付を表示する可能性があります。
開発

2

これを行う1つの方法を次に示します。

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));


1

function myYmd(D){
    var pad = function(num) {
        var s = '0' + num;
        return s.substr(s.length - 2);
    }
    var Result = D.getFullYear() + '-' + pad((D.getMonth() + 1)) + '-' + pad(D.getDate());
    return Result;
}

var datemilli = new Date('Sun May 11,2014');
document.write(myYmd(datemilli));


1

var d = new Date("Sun May 1,2014");

var year  = d.getFullYear();
var month = d.getMonth() + 1;
var day   = d.getDate(); 

month = checkZero(month);             
day   = checkZero(day);

var date = "";

date += year;
date += "-";
date += month;
date += "-";
date += day;

document.querySelector("#display").innerHTML = date;
    
function checkZero(i) 
{
    if (i < 10) 
    {
        i = "0" + i
    };  // add zero in front of numbers < 10

    return i;
}
<div id="display"></div>


1
new Date(new Date(YOUR_DATE.toISOString()).getTime() - 
                 (YOUR_DATE.getTimezoneOffset() * 60 * 1000)).toISOString().substr(0, 10)

1

以前の回答のいくつかは問題ありませんでしたが、あまり柔軟性がありませんでした。私は本当により多くのエッジケースを処理できる何かが欲しかったので、@ 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.
    // It 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');

すてきなクリーンでコメント付きのソリューション。しかし、私は最初の引数について懐疑的です。最初の引数は、有効な日付として認識されない場合、静かに新しい新しい日付に置き換えられます。代わりに、この「オプションのデフォルト値」を2番目の引数として設定し、形式が認識されない場合に何らかの例外(単純な「無効な日付形式」が文字列を返す可能性があります)を返し、エラーが明確に表示されるようしますテスター/ユーザー
Balmipour

1

これは私が現在の日付を希望の形式で取得するのに役立ちました(YYYYMMDD HH:MM:SS):

var d = new Date();

var date1 = d.getFullYear() + '' +
            ((d.getMonth()+1) < 10 ? "0" + (d.getMonth() + 1) : (d.getMonth() + 1)) +
            '' +
            (d.getDate() < 10 ? "0" + d.getDate() : d.getDate());

var time1 = (d.getHours() < 10 ? "0" + d.getHours() : d.getHours()) +
            ':' +
            (d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes()) +
            ':' +
            (d.getSeconds() < 10 ? "0" + d.getSeconds() : d.getSeconds());

print(date1+' '+time1);

1

ライブラリは必要ありません

純粋なJavaScript。

以下の例は、今日から過去2か月を取得します。

var d = new Date()
d.setMonth(d.getMonth() - 2);
var dateString = new Date(d);
console.log('Before Format', dateString, 'After format', dateString.toISOString().slice(0,10))


危険な。その場合は、タイムゾーンのオフセットを無視します。
maxence51

1

PHP互換の日付形式

PHP関数date()と同じパラメーターを取り、JavaScriptで日付/時刻文字列を返す小さな関数を次に示します。

PHPのすべてのdate()形式オプションがサポートされているわけではないことに注意してください。partsオブジェクトを拡張して、不足しているフォーマットトークンを作成できます。

/**
 * Date formatter with PHP "date()"-compatible format syntax.
 */
const formatDate = (format, date) => {
  if (!format) { format = 'Y-m-d' }
  if (!date) { date = new Date() }

  const parts = {
    Y: date.getFullYear().toString(),
    y: ('00' + (date.getYear() - 100)).toString().slice(-2),
    m: ('0' + (date.getMonth() + 1)).toString().slice(-2),
    n: (date.getMonth() + 1).toString(),
    d: ('0' + date.getDate()).toString().slice(-2),
    j: date.getDate().toString(),
    H: ('0' + date.getHours()).toString().slice(-2),
    G: date.getHours().toString(),
    i: ('0' + date.getMinutes()).toString().slice(-2),
    s: ('0' + date.getSeconds()).toString().slice(-2)
  }

  const modifiers = Object.keys(parts).join('')
  const reDate = new RegExp('(?<!\\\\)[' + modifiers + ']', 'g')
  const reEscape = new RegExp('\\\\([' + modifiers + '])', 'g')

  return format
    .replace(reDate, $0 => parts[$0])
    .replace(reEscape, ($0, $1) => $1)
}

// ----- EXAMPLES -----
console.log( formatDate() ); // "2019-05-21"
console.log( formatDate('H:i:s') ); // "16:21:32"
console.log( formatDate('Y-m-d, o\\n H:i:s') ); // "2019-05-21, on 16:21:32"
console.log( formatDate('Y-m-d', new Date(2000000000000)) ); // "2033-05-18"

要旨

これは、formatDate()関数の更新バージョンと追加の例の要点です。https//gist.github.com/stracker-phil/c7b68ea0b1d5bbb97af0a6a3dc66e0d9


0

答えのさらに別の組み合わせ。読みやすいですが、少し時間がかかります。

function getCurrentDayTimestamp() {
  const d = new Date();

  return new Date(
    Date.UTC(
      d.getFullYear(),
      d.getMonth(),
      d.getDate(),
      d.getHours(),
      d.getMinutes(),
      d.getSeconds()
    )
  // `toIsoString` returns something like "2017-08-22T08:32:32.847Z"
  // and we want the first part ("2017-08-22")
  ).toISOString().slice(0, 10);
}

0

日付がすべてのタイムゾーンで同じである必要がある場合、たとえばデータベースの値を表す場合は、JavaScript日付オブジェクトで日、月、年の関数のUTCバージョンを使用してください。これはUTC時間で表示され、特定のタイムゾーンで1つずれるエラーを回避します。

さらに良いことに、この種のフォーマットにはMoment.js日付ライブラリを使用してください


0

Samit Satputeの応答を次のように変更しました。

var newstartDate = new Date();
// newstartDate.setDate(newstartDate.getDate() - 1);
var startDate = newstartDate.toISOString().replace(/[-T:\.Z]/g, ""); //.slice(0, 10); // To get the Yesterday's Date in YYYY MM DD Format
console.log(startDate);


0

ハッシュマップデータから最大日付と最小日付をフォーマットして見つける:

var obj = {"a":'2001-15-01', "b": '2001-12-02' , "c": '2001-1-03'};

function findMaxMinDate(obj){
  let formatEncode = (id)=> { let s = id.split('-'); return `${s[0]+'-'+s[2]+'-'+s[1]}`}
  let formatDecode = (id)=> { let s = id.split('/'); return `${s[2]+'-'+s[0]+'-'+s[1]}`}
  let arr = Object.keys( obj ).map(( key )=> { return new Date(formatEncode(obj[key])); });
  let min = new Date(Math.min.apply(null, arr)).toLocaleDateString();
  let max = new Date(Math.max.apply(null, arr)).toLocaleDateString();
  return {maxd: `${formatDecode(max)}`, mind:`${formatDecode(min)}`}
}

console.log(findMaxMinDate(obj));


これは質問とどのように関連していますか(日付のフォーマット)?
Peter Mortensen

0

日付文字列の再フォーマットはかなり簡単です、例えば

var s = 'Sun May 11,2014';

function reformatDate(s) {
  function z(n){return ('0' + n).slice(-2)}
  var months = [,'jan','feb','mar','apr','may','jun',
                 'jul','aug','sep','oct','nov','dec'];
  var b = s.split(/\W+/);
  return b[3] + '-' +
    z(months.indexOf(b[1].substr(0,3).toLowerCase())) + '-' +
    z(b[2]);
}

console.log(reformatDate(s));

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.