Di mana saya dapat menemukan dokumentasi tentang memformat tanggal dalam JavaScript? [Tutup]

1398

Saya perhatikan bahwa new Date()fungsi JavaScript sangat cerdas dalam menerima tanggal dalam beberapa format.

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

Saya tidak dapat menemukan dokumentasi di mana pun menampilkan semua format string yang valid saat memanggil new Date()fungsi.

Ini untuk mengonversi string menjadi tanggal. Jika kita melihat sisi yang berlawanan, yaitu, mengubah objek tanggal ke string, sampai sekarang saya mendapat kesan bahwa JavaScript tidak memiliki API bawaan untuk memformat objek tanggal menjadi string.

Catatan editor: Pendekatan berikut adalah upaya penanya yang bekerja pada browser tertentu tetapi tidak berfungsi secara umum; lihat jawaban di halaman ini untuk melihat beberapa solusi aktual.

Hari ini, saya bermain dengan toString()metode pada objek tanggal dan mengejutkan itu melayani tujuan memformat tanggal ke string.

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

Juga di sini saya tidak dapat menemukan dokumentasi tentang semua cara kita dapat memformat objek tanggal menjadi string.

Di mana dokumentasi yang mencantumkan penspesifikasi format yang didukung oleh Date()objek?

Naga Kiran
sumber
165
contoh Anda tidak benar-benar berfungsi seperti yang Anda pikirkan: jsfiddle.net/edelman/WDNVk/1
Jason
27
Maaf, meneruskan format string ke toString berfungsi di .NET, dan mungkin berfungsi di Jawa, tetapi seperti yang ditunjukkan Jason, ini sebenarnya tidak berfungsi di Javascript.
Joshua Carmody
12
Orang-orang ingat - pertanyaan, tidak peduli seberapa kanonik, perlu tetap menjadi pertanyaan . Harap jangan mengedit apa pun yang mengubah pertanyaan ini menjadi jawaban, saring dan pertahankan jawaban sebagai gantinya. Terima kasih :)
Posting Tim
1
Saya menggunakan kode di tautan ini msdn.microsoft.com/en-us/library/ie/ff743760(v=vs.94).aspx - (date.toLocaleDateString ("en-US"));
Khaled Annajar
Jika pengunjung masa depan ke halaman ini bingung dengan bagaimana sebagian besar jawaban berhubungan dengan pertanyaan, saya sarankan membaca revisi pertanyaan , terutama (jika berbeda dari di atas) revisi 15 @ Eric Muyser - I untuk satu bingung dengan kurangnya yang tidak valid Tanggal # toString penggunaan.
user66001

Jawaban:

1063

Saya suka 10 cara untuk memformat waktu dan tanggal menggunakan JavaScript dan Bekerja dengan Tanggal .

Pada dasarnya, Anda memiliki tiga metode dan Anda harus menggabungkan string untuk diri sendiri:

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

Contoh:

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

Haim Evgi
sumber
27
Kedua situs ini memiliki lisensi terbatas. Jadi, jika Anda menggunakan kode (tanpa izin), Anda akan melanggar. Momentjs ( stackoverflow.com/a/10119138/278976 ) terlihat seperti opsi yang jauh lebih baik dan merupakan lisensi MIT.
Homer6
4
@ penjual Jawaban ini menjawab pertanyaan "Bagaimana cara memformat tanggal dalam javascript?" yang secara efektif adalah judul pertanyaan. Dalam tubuh pertanyaan dia cukup menyesatkan. Dan, untuk poin Anda, jawaban ini tidak berbicara tentang pemformatan string menggunakan pustaka non-standar atau tidak disebutkan secara acak. Tetapi bagian dari pertanyaan itu ditanyakan secara tidak benar, sebagaimana ditunjukkan oleh komentar # 1 pada pertanyaan tersebut. Jadi, ini menjawab pertanyaan sebenarnya, tetapi bukan format string yang sebenarnya tidak ada.
McKay
3
@McKay; bukan itu pertanyaannya. Saya pikir Anda salah memahami apa yang diminta peller atau menjadi tumpul dalam alasan Anda.
codeinthehole
10
@codeinthehole "Memformat tanggal dalam Javascript" adalah pertanyaannya. "sampai sekarang saya mendapat kesan bahwa JavaScript tidak memiliki API bawaan untuk memformat objek tanggal menjadi string." tetapi kemudian berbicara tentang perilaku, yang saya percaya menurutnya asli dalam javascript. Tanpa mengetahui perpustakaan mana yang dia salah referensi, saya kira tebakan terbaiknya adalah dia mengajukan pertanyaan, "Bagaimana saya memformat tanggal dalam javascript?" dan saya tidak berpikir saya mengambil lompatan liar.
McKay
5
MM berarti 01-12, bukan 1-12: 2013-04-17 => OK 2013-4-17 => BAD
Adrian Maire
678

Moment.js

Ini adalah (tanggal) JavaScript * perpustakaan tanggal untuk parsing, memanipulasi, dan memformat tanggal.

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"

(*) Makna ringan 9.3KB yang diperkecil + di-gzip dalam pengaturan sekecil mungkin (feb 2014)

chx007
sumber
7
Ini juga menyediakan pola dekorator di sekitar objek Date daripada monyet yang meninju objek inti, sehingga Anda cenderung tidak akan mendapatkan konflik di jalan.
Gabe Martin-Dempesy
120
Tolong berhenti menyalahgunakan kata "ringan". Bahkan 5kb sangat besar untuk fungsi seperti itu, dan seperti saat ini ukurannya telah meningkat menjadi 19kb.
user123444555621
27
@ Pumbaa80 Saya tidak setuju bahwa "Bahkan 5kb sangat besar untuk fungsi seperti itu". Pernahkah Anda melihat dokumen? Ini adalah perpustakaan yang sangat berguna untuk menangani tanggal di JS. Saya mengerti memiliki perpustakaan yang lebih besar dari beberapa KB untuk penggunaan tunggal format dasar seperti "D / M / Y" bisa sedikit berlebihan, tetapi perbedaan beberapa KB menjadi diabaikan karena kemudahan penggunaan yang disediakan perpustakaan. . Kode yang dapat dipertahankan adalah hal yang baik untuk beberapa KB. Jika + 100KB diperkecil, namun saya setuju.
Turnerj
15
@Tumerj berpendapat bahwa itu berguna tidak melakukan apa pun untuk mengatasi kekhawatiran menjadi ringan. Keduanya tidak berhubungan.
JoshJordan
9
Anda tidak dapat membuat pesawat jet lebih ringan dengan melepas mesin karena kemudian menjadi glider dan bukan jet. Ringan berarti sesuatu hanya memiliki fungsionalitas yang diperlukan untuk melakukan fungsi yang ditentukan. Ergo, ini adalah solusi yang ringan.
Bon
425

Jika Anda sudah menggunakan jQuery UI di proyek Anda, Anda bisa menggunakan metode datepicker bawaan untuk memformat objek tanggal Anda:

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

Namun, datepicker hanya memformat tanggal, dan tidak dapat memformat waktu.

Lihatlah datepicker UI formatdate jQuery , contoh-contohnya.

Casid
sumber
bagaimana cara mengatakannya untuk menggunakan waktu setempat atau Zulu?
Ustaman Sangat
7
saya lebih suka menggunakan solusi ini untuk mendapatkan waktu tanpa pustaka: Date baru (). toTimeString (). match (/ ^ ([0-9] {2}: [0-9] {2}: [0-9 ] {2}) /) [0] FYI
markcial
apakah ada cara untuk melakukan ini $ .datepicker.formatDate ('yy-mm-dd', Date baru ("txtAdvDate" .Val ()); atau yang seperti itu
Pomster
@ Tomster - apa yang akan membuat Anda berpikir string "txtAdvDate" akan memiliki metode val di atasnya? Apakah maksud Anda $ ('# txtAdvDate'). Val ()? Dengan asumsi itu cocok dengan salah satu konstruktor (lihat di sini w3schools.com/jsref/jsref_obj_date.asp ) maka itu akan berfungsi dengan baik.
vbullinger
@Pomster - coba gunakan ini: document.getElementById (id) .value = $ .datepicker.formatDate ('yy-mm-dd', Date baru ());
mrrsb
219

Di mana dokumentasi yang mencantumkan penspesifikasi format yang didukung oleh Date()objek?

Saya menemukan ini hari ini dan cukup terkejut bahwa tidak ada yang meluangkan waktu untuk menjawab pertanyaan sederhana ini. Benar, ada banyak perpustakaan di luar sana untuk membantu memanipulasi tanggal. Beberapa lebih baik dari yang lain. Tapi itu bukan pertanyaan yang diajukan.

AFAIK, JavaScript murni tidak mendukung penentu format dengan cara yang Anda tentukan ingin menggunakannya . Tapi itu metode dukungan untuk format tanggal dan / atau waktu, seperti .toLocaleDateString(), .toLocaleTimeString(), dan.toUTCString() .

The Datereferensi obyek saya paling sering gunakan adalah di situs w3schools.com (tapi cepat pencarian Google akan mengungkapkan banyak lagi yang mungkin lebih memenuhi kebutuhan Anda).

Juga perhatikan bahwa bagian Properti Objek Tanggal menyediakan tautan ke prototype, yang menggambarkan beberapa cara Anda dapat memperluas objek Tanggal dengan metode khusus. Ada beberapa perdebatan dalam komunitas JavaScript selama bertahun-tahun tentang apakah ini praktik terbaik atau tidak, dan saya tidak mendukung atau menentangnya, hanya menunjukkan keberadaannya.

Scott Offen
sumber
26
MDN juga merupakan referensi yang bagus: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Cypher
2
Jawaban saya berusaha menjawab pertanyaan ini juga. Saya percaya bahwa browser Firefox atau Mozilla pernah memberikan metode Date.toString () yang mengambil string format seperti itu. Sayangnya, saya tidak dapat menemukan jejak dari dokumentasi lama. Ini bukan lagi bagian dari standar dan tampaknya tidak lagi didukung di mana pun, bahkan di Firefox.
peller
214

Fungsi pemformatan khusus:

Untuk format tetap, fungsi sederhana membuat pekerjaan. Contoh berikut menghasilkan format internasional YYYY-MM-DD:

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

Catatan: Namun, biasanya bukan ide yang baik untuk memperluas perpustakaan standar Javascript (misalnya dengan menambahkan fungsi ini ke prototipe Tanggal).

Fungsi yang lebih maju dapat menghasilkan output yang dapat dikonfigurasi berdasarkan parameter format. Ada beberapa contoh bagus di halaman yang sama ini.

Jika menulis fungsi pemformatan terlalu panjang, ada banyak pustaka yang dapat melakukannya. Beberapa jawaban lain sudah menyebutkannya. Tetapi meningkatnya ketergantungan juga menjadikannya bagian-lawan.

Fungsi pemformatan ECMAScript standar:

Karena versi ECMAscript yang lebih baru, Datekelas memiliki beberapa fungsi pemformatan khusus:

toDateString : Ketergantungan implementasi, hanya tampilkan tanggal.

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 : Tampilkan tanggal dan waktu 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 untuk 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 : Ketergantungan implementasi, tanggal dalam format lokal.

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

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

toLocaleString : Ketergantungan implementasi, tanggal & waktu dalam format lokal.

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 : Ketergantungan implementasi, waktu dalam format lokal.

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 Umum untuk Tanggal.

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

Catatan: dimungkinkan untuk menghasilkan keluaran khusus dari fungsi pemformatan tersebut:

new Date().toISOString().slice(0,10); // By @Image72, return YYYY-MM-DD
Adrian Maire
sumber
10
Itu harus diterima jawaban, karena memberikan format yang diperlukan (01-01-2000, bukan 1-1-2000)
Danubian Sailor
6
Date baru (). toISOString (). slice (0,10) // "2015-04-27"
image72
2
Akan sangat membantu untuk tidak memiliki contoh dengan 11 September sehingga akan jelas di posisi mana hari dan bulan terwakili.
Karl Adler
1
@abimelex selesai. Semoga lebih jelas sekarang.
Adrian Maire
125

Jawaban Singkat

Tidak ada dokumentasi "universal" yang dapat dilayani oleh javascript; setiap browser yang memiliki javascript benar-benar sebuah implementasi. Namun, ada standar yang cenderung diikuti oleh kebanyakan browser modern, dan itulah standar EMCAScript; string standar ECMAScript akan mengambil, minimal, implementasi modifikasi dari definisi ISO 8601.

Selain itu, ada standar kedua yang ditetapkan oleh IETF yang cenderung diikuti peramban, yang merupakan definisi untuk cap waktu yang dibuat dalam RFC 2822. Dokumentasi aktual dapat ditemukan dalam daftar referensi di bagian bawah.

Dari sini Anda dapat mengharapkan fungsionalitas dasar, tetapi apa yang "seharusnya" tidak secara inheren adalah "apa". Aku akan pergi sedikit mendalam dengan ini secara prosedural, karena tampaknya hanya tiga orang yang benar-benar menjawab pertanyaan (Scott, goofballLogic, dan peller yaitu) yang, bagi saya, menyarankan kebanyakan orang tidak menyadari apa yang sebenarnya terjadi ketika Anda buat objek Date.


Jawaban Panjang

Di mana dokumentasi yang mencantumkan penspesifikasi format yang didukung oleh objek Date ()?


Untuk menjawab pertanyaan, atau biasanya mencari jawaban untuk pertanyaan ini, Anda perlu tahu bahwa javascript bukan bahasa novel; ini sebenarnya merupakan implementasi dari ECMAScript, dan mengikuti standar ECMAScript (tapi perlu diketahui, javascript juga sebenarnya sudah meng-pre-date standar-standar tersebut; standar EMCAScript dibangun dari implementasi awal LiveScript / JavaScript). Standar ECMAScript saat ini adalah 5.1 (2011); pada saat pertanyaan awalnya diajukan (Juni '09), standarnya adalah 3 (4 ditinggalkan), tetapi 5 dirilis tidak lama setelah posting pada akhir 2009. Ini harus menguraikan satu masalah; standar apa yang bisa diikuti oleh implementasi javascript, mungkin tidak mencerminkan apa yang sebenarnya ada, karena a) ini merupakan implementasi dari standar yang diberikan, b) tidak semua implementasi standar adalah puritan,

Pada dasarnya, ketika berhadapan dengan javascript, Anda berhadapan dengan turunan (javascript khusus untuk browser) dari suatu implementasi (javascript itu sendiri). Google V8, misalnya, mengimplementasikan ECMAScript 5.0, tetapi Internet Explorer JScript tidak berusaha untuk memenuhi standar ECMAScript, namun Internet Explorer 9 sesuai dengan ECMAScript 5.0.

Ketika satu argumen dilewatkan ke Date () baru, ia melemparkan prototipe fungsi ini:

new Date(value)

Ketika dua atau lebih argumen diteruskan ke Date () baru, ia melemparkan prototipe fungsi ini:

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


Kedua fungsi tersebut seharusnya terlihat familier, tetapi ini tidak segera menjawab pertanyaan Anda dan apa yang dikuantifikasi sebagai "format tanggal" yang dapat diterima memerlukan penjelasan lebih lanjut. Ketika Anda meneruskan string ke Date () baru, itu akan memanggil prototipe (perhatikan bahwa saya menggunakan kata prototipe secara longgar; versi mungkin fungsi individu, atau mungkin menjadi bagian dari pernyataan kondisional dalam fungsi tunggal) untuk Tanggal baru (nilai) dengan string Anda sebagai argumen untuk parameter "nilai". Fungsi ini pertama-tama akan memeriksa apakah itu angka atau string. Dokumentasi untuk fungsi ini dapat ditemukan di sini:

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

Dari ini, kita dapat menyimpulkan bahwa untuk mendapatkan pemformatan string diizinkan untuk Date (nilai) baru, kita harus melihat metode Date.parse (string). Dokumentasi untuk metode ini dapat ditemukan di sini:

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

Dan kita dapat lebih jauh menyimpulkan bahwa tanggal diharapkan dalam format diperpanjang ISO 8601 yang dimodifikasi, seperti yang ditentukan di sini:

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

Namun, kami dapat mengenali dari pengalaman bahwa objek Date javascript menerima format lain (diberlakukan oleh keberadaan pertanyaan ini di tempat pertama), dan ini tidak apa-apa karena ECMAScript memungkinkan untuk mengimplementasikan format spesifik. Namun, itu masih belum menjawab pertanyaan tentang dokumentasi apa yang tersedia pada format yang tersedia, atau format apa yang sebenarnya diperbolehkan. Kita akan melihat implementasi javascript Google, V8; harap dicatat saya tidak menyarankan ini adalah mesin javascript "terbaik" (bagaimana seseorang dapat mendefinisikan "terbaik" atau bahkan "baik") dan orang tidak dapat berasumsi bahwa format yang diperbolehkan dalam V8 mewakili semua format yang tersedia saat ini, tapi saya pikir ini adil untuk menganggap mereka mengikuti harapan modern.

V8 Google, date.js, DateConstructor

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

Melihat fungsi DateConstructor, kita dapat menyimpulkan bahwa kita perlu menemukan fungsi DateParse; Namun, perhatikan bahwa "tahun" bukan tahun yang sebenarnya dan hanya referensi ke parameter "tahun".

V8 Google, date.js, DateParse

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

Ini memanggil% DateParseString, yang sebenarnya merupakan referensi fungsi run-time untuk fungsi C ++. Itu mengacu pada kode berikut:

V8 Google, runtime.cc,% DateParseString

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

Panggilan fungsi yang kami perhatikan dalam fungsi ini adalah untuk DateParser :: Parse (); abaikan logika yang mengelilingi panggilan fungsi tersebut, ini hanya pemeriksaan untuk menyesuaikan dengan tipe penyandian (ASCII dan UC16). DateParser :: Parse didefinisikan di sini:

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

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

Ini adalah fungsi yang sebenarnya mendefinisikan format apa yang diterimanya. Pada dasarnya, ia memeriksa standar EMCAScript 5.0 ISO 8601 dan jika tidak memenuhi standar, maka ia akan berusaha untuk membangun tanggal berdasarkan format lama. Beberapa poin kunci berdasarkan komentar:

  1. Kata-kata sebelum nomor pertama yang tidak diketahui oleh parser diabaikan.
  2. Teks yang dikurung diabaikan.
  3. Angka yang tidak ditandai diikuti oleh ":" ditafsirkan sebagai "komponen waktu".
  4. Nomor yang tidak ditandai diikuti oleh "." ditafsirkan sebagai "komponen waktu", dan harus diikuti oleh milidetik.
  5. Angka yang ditandatangani diikuti oleh jam atau menit jam (misalnya +5: 15 atau +515) ditafsirkan sebagai zona waktu.
  6. Saat mendeklarasikan jam dan menit, Anda dapat menggunakan "hh: mm" atau "hhmm".
  7. Kata-kata yang menunjukkan zona waktu ditafsirkan sebagai zona waktu.
  8. Semua angka lainnya ditafsirkan sebagai "komponen tanggal".
  9. Semua kata yang dimulai dengan tiga digit pertama dalam sebulan ditafsirkan sebagai bulan.
  10. Anda dapat menentukan menit dan jam bersama dalam salah satu dari dua format: "hh: mm" atau "hhmm".
  11. Simbol seperti "+", "-" dan ")" yang tidak cocok tidak diizinkan setelah nomor telah diproses.
  12. Item yang cocok dengan berbagai format (mis. 1970-01-01) diproses sebagai string EMCAScript 5.0 ISO 8601 yang sesuai standar.

Jadi ini harus cukup untuk memberi Anda ide dasar tentang apa yang diharapkan ketika harus memasukkan string ke objek Date. Anda dapat memperluas ini dengan melihat spesifikasi berikut yang ditunjuk Mozilla di Jaringan Pengembang Mozilla (sesuai dengan cap waktu IETF RFC 2822):

http://tools.ietf.org/html/rfc2822# halaman 14

Jaringan Pengembang Microsoft juga menyebutkan standar tambahan untuk objek Tanggal: ECMA-402, Spesifikasi API Internasionalisasi Script ECMAS, yang melengkapi standar ECMAScript 5.1 (dan yang akan datang). Itu dapat ditemukan di sini:

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

Bagaimanapun, ini harus membantu menyoroti bahwa tidak ada "dokumentasi" yang secara universal mewakili semua implementasi javascript, tetapi masih ada cukup dokumentasi yang tersedia untuk membuat akal yang masuk akal dari string apa yang dapat diterima untuk objek Date. Pertanyaan yang cukup dimuat ketika Anda memikirkannya, ya? : P

Referensi

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# halaman 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

Sumber daya

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

Sg'te'gmuj
sumber
92

Pastikan Anda checkout Datejs ketika berhadapan dengan tanggal dalam JavaScript. Ini cukup mengesankan dan didokumentasikan dengan baik seperti yang Anda lihat jika ada fungsi toString .

EDIT : Tyler Forsythe menunjukkan, datejs itu sudah ketinggalan zaman. Saya menggunakannya dalam proyek saya saat ini dan tidak memiliki masalah dengan itu, namun Anda harus menyadari hal ini dan mempertimbangkan alternatif.

Tim Büthe
sumber
2
Saya tidak bisa menemukan cara untuk memberi makan datejs dengan milidetik untuk membuat kencan. Seperti itu: var dateTime = Tanggal baru (); dateTime.setTime (milidetik);
Arne Evertsson
14
25rb Hanya untuk kencan? Aduh.
Ben Lesh
13
Datejs adalah perpustakaan usang yang belum melihat perkembangan aktif dalam ~ 5 tahun. Sumber mereka ada di Github dan Google Code dan keduanya memiliki tanggal terakhir diperbarui tahun 2008 (2013). Demi kewarasan Anda, pergi dengan XDate atau Moment.js.
Tyler Forsythe
3
@ TylerForsythe saya menambahkan petunjuk / peringatan tentang itu.
Tim Büthe
2
lol skrip tanggal kedaluwarsa ...
rtpHarry
69

Anda bisa memperluas Dateobjek dengan formatmetode baru seperti yang dicatat oleh meizz , di bawah ini adalah kode yang diberikan oleh penulis. Dan di sini ada 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"));
gongzhitaao
sumber
Ditingkatkan sedikit untuk keperluan saya untuk mendukung AM / PM - lihat di bawah
Michael Angstadt
@WHK Tapi aku masih lebih suka momentjs : D
gongzhitaao
Mengalami masalah saat mengambil bulan: Tanggal baru ((Tanggal baru ()). Format ('yyyy-MM-dd')) kembali Mei tetapi sekarang Jun: - / siapa yang menggunakan zona waktu dalam string parse?
e-info128
1
@WHK Ini sebenarnya adalah parser tanggal yang sangat primitif. Hanya untuk berjaga-jaga jika Anda tidak perlu mengacaukan kencan terlalu banyak. Jika Anda benar-benar perlu mengatasi berbagai format tanggal, saya akan merekomendasikan perpustakaan yang berdiri sendiri seperti momentjs. : D
gongzhitaao
1
@WHK Karena console.log(new Date('2014-06-01')) -> Maysaya pikir itu ada hubungannya dengan zona waktu: D
gongzhitaao
37

Fungsionalitas yang Anda sebutkan bukan Javascript standar, tidak mungkin portabel di seluruh browser dan karenanya bukan praktik yang baik. The ECMAScript 3 spek daun parse dan output format berfungsi hingga pelaksanaan Javascript. ECMAScript 5 menambahkan subset dukungan ISO8601. Saya percaya fungsi toString () yang Anda sebutkan adalah inovasi dalam satu browser (Mozilla?)

Beberapa perpustakaan menyediakan rutinitas untuk parameter ini, beberapa dengan dukungan lokalisasi yang luas. Anda juga dapat memeriksa metode di dojo.date.locale .

peller
sumber
5
Mencoba menjawab pertanyaan itu tidak akan memberi Anda banyak suara. Hanya menominasikan perpustakaan populer dan melihat skor Anda terbang !!
RobG
30

Saya membuat formatter yang sangat sederhana ini, cut / n / pastable (Diperbarui dengan versi yang lebih rapi):

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/

Lyndon S
sumber
4
Saya suka kelas ini tetapi berpikir itu harus kelas "statis". Tidak perlu instantiate lebih dari sekali. (tidak perlu new DateFmt())
Cheeso
1
Cheeso: Bagaimana jika saya ingin memformat 10 tanggal berbeda pada halaman 3 dengan cara yang berbeda, masing-masing? Dalam hal ini akan berguna untuk memiliki tiga contoh formatter ini. Itu adalah usecase yang benar-benar valid untuk mencegah hal ini. OP merancang ini dengan benar. Menentukan format pada waktu konstruksi juga menyimpan duplikasi kode menentukan format setiap kali Anda membutuhkannya diformat dengan cara tertentu.
hsanders
29

Kerangka kerja gratis, terbatas tetapi ringan

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"
John Williams
sumber
apakah ini cross browser? dan lintas lokal?
Iftah
Iya. Memperlihatkan waktu di zona waktu lokal Anda (pengguna browser).
John Williams
18

Setelah memeriksa beberapa opsi yang disediakan dalam jawaban lain, saya memutuskan untuk menulis solusi saya sendiri yang terbatas tetapi sederhana yang mungkin bermanfaat bagi orang lain.

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

Contoh penggunaan:

console.log("The date is: " + dateFormat(new Date(), "DD/MM/YYYY"));
Ollie Bennett
sumber
2
mengganti operasi tidak terlalu efisien, jadi itu praktik yang lebih baik untuk mencegahnya.
mrzmyr
bagaimana jika saya menulis, apa yang akan terjadi? console.log ("Tanggalnya adalah:" + dateFormat (Tanggal baru (), "DD / MM / YY"));
hakan
1
Ini akan mencetak teks "Tanggalnya adalah: 12/11 / YY", karena di atas tidak menangani tanggal 2 digit. Jika Anda membutuhkan ini, Anda bisa menambahkan berikut segera sebelum pernyataan kembali: format = format.replace("YY", (""+date.getFullYear()).substring(2));. Ini semakin jelek - Anda mungkin ingin turun rute RegEx atau sejenisnya.
Ollie Bennett
1
@ mrzmyr Apakah Anda benar-benar berpikir bahwa memformat tanggal akan menjadi hambatan kinerja? Ayolah.
doug65536
11

Inilah fungsi yang sering saya gunakan. Hasilnya adalah yyyy-mm-dd jj: 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);
}
Carl
sumber
1
jawaban yang bagus, tapi saya pikir Anda harus mengubah fungsi zp2 sebagai: var zp2 = function (val) {return val <= 9? '00' + val: (val <= 99? '0' + val: '' + val); }
Eric Wang
1
ada pengecualian, ketika nilai bagian ms adalah 0, itu tidak sama, dalam fungsi Anda hasilnya adalah '00', tetapi bukan '000'.
Eric Wang
9

Anda mungkin menemukan modifikasi objek tanggal yang bermanfaat ini, yang lebih kecil dari perpustakaan mana pun dan mudah diperluas untuk mendukung format yang berbeda:

CATATAN:

  • Ini menggunakan Object.keys () yang tidak terdefinisi di browser lama sehingga Anda mungkin perlu mengimplementasikan polyfill dari tautan yang diberikan.

KODE

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

MENGGUNAKAN

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
Vaclav
sumber
8

Hanya untuk melanjutkan jawaban solid gongzhitaao - ini menangani 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;
}
Michael Angstadt
sumber
Solusi yang sangat bagus! var a = Tanggal baru (); a.format ('yyyy-MM-d'); // Pengembalian 2013-08-16.
Adrian Maire
this.getMonth (); gagal di iOS
N20084753
7

Saya tidak dapat menemukan dokumentasi definitif tentang format tanggal yang valid, jadi saya menulis tes saya sendiri untuk melihat apa yang didukung di berbagai browser.

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

Hasil saya menyimpulkan bahwa format berikut ini valid di semua browser yang saya uji (contoh menggunakan tanggal "9 Agustus 2013"):

[Tahun Penuh] / [Bulan] / [Nomor tanggal] - Bulan dapat berupa angka dengan atau tanpa nol di depan atau nama bulan dalam format pendek atau panjang, dan nomor tanggal dapat dengan atau tanpa nol di depan.

  • 2013/08/09
  • 2013/08/9
  • 2013/8/09
  • 2013/8/9
  • 2013 / Agustus / 09
  • 2013 / Agustus / 9
  • 2013 / Agustus / 09
  • 2013 / Agustus / 9

[Bulan] / [Tahun Penuh] / [Nomor Tanggal] - Bulan dapat berupa angka dengan atau tanpa nol di depan atau nama bulan dalam format pendek atau panjang, dan nomor tanggal dapat dengan atau tanpa nol di depan.

  • 08/2013/09
  • 08/2013/9
  • 8/2013/09
  • 8/2013/9
  • Agustus / 2013/09
  • Agustus / 2013/9
  • Agustus / 2013/09
  • Agustus / 2013/9

Kombinasi dari [Tahun Penuh], [Nama Bulan] dan [Nomor Tanggal] dipisahkan dengan spasi - Nama bulan dapat dalam format pendek atau panjang, dan nomor tanggal dapat dengan atau tanpa nol di depan.

  • 2013 09 Agustus
  • Agustus 2013 09
  • 09 Agustus 2013
  • 2013 Agustus 09
  • 9 Agustus 2013
  • 2013 9 Agustus
  • dll ...

Juga berlaku di "browser modern" (atau dengan kata lain semua browser kecuali IE9 dan di bawah)

[Tahun Penuh] - [Nomor Bulan] - [Nomor Tanggal] - Bulan dan Nomor Tanggal harus menyertakan angka nol di depan (ini adalah format yang digunakan oleh tipe Tanggal MySQL )

  • 2013-08-09

Menggunakan nama bulan:
Menariknya, ketika menggunakan nama bulan saya menemukan bahwa hanya 3 karakter pertama dari nama bulan yang pernah digunakan sehingga semua hal berikut ini benar-benar valid:

new Date('9 August 2013');
new Date('9 Aug 2013');
new Date('9 Augu 2013');
new Date('9 Augustagfsdgsd 2013');
Pete Newnham
sumber
6

Memformat dan terutama mem-parsing tanggal dalam JavaScript bisa menjadi sedikit sakit kepala. Tidak semua browser menangani tanggal dengan cara yang sama. Jadi, meskipun berguna untuk mengetahui metode dasar, lebih praktis menggunakan perpustakaan pembantu.

The XDate javascript library oleh Adam Shaw telah ada sejak pertengahan 2011 dan masih dalam pengembangan aktif. Ini memiliki dokumentasi yang luar biasa, API yang hebat, pemformatan, mencoba untuk tetap kompatibel dengan mundur dan bahkan mendukung string yang dilokalkan.

Tautan untuk mengubah string lokal: https://gist.github.com/1221376

Sam Lown
sumber
6

Kode contoh:

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

Keluaran:

"13:45:20"

Nery Jr
sumber
2
perlu dicatat dengan toISOString (); ini menghasilkan UTC. Jadi jika new Date();// = Fri Nov 22 2013 17:48:22 GMT+0100, output dengan kode di atas adalah"16:48:22"
Tewr
6

Library sugar.js memiliki beberapa fungsi hebat untuk bekerja dengan tanggal dalam JavaScript. Dan itu didokumentasikan dengan sangat baik .

Sugar memberikan kelas Date banyak cinta dimulai dengan metode Date.create yang dapat memahami tanggal dalam hampir semua format dalam 15 bahasa utama, termasuk format relatif seperti "1 jam yang lalu". Tanggal juga bisa berupa output dalam format atau bahasa apa pun menggunakan sintaksis yang mudah dipahami, dengan pintasan ke format tanggal yang umum digunakan. Perbandingan tanggal yang kompleks juga dimungkinkan dengan metode seperti ini, yang memahami format apa pun dan menerapkan presisi yang dibangun.

Beberapa contoh:

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"
ahkvk
sumber
4

Semua browser

Cara paling dapat diandalkan untuk memformat tanggal dengan format sumber yang Anda gunakan, adalah menerapkan langkah-langkah berikut:

  1. Gunakan new Date()untuk membuat Dateobjek
  2. Gunakan .getDate(), .getMonth()dan.getFullYear() untuk mendapatkan masing-masing hari, bulan dan tahun
  3. Rekatkan potongan-potongan itu menurut format target Anda

Contoh:

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

(Lihat juga Fiddle ini ).


Hanya peramban modern

Anda juga dapat menggunakan .toLocaleDateStringmetode bawaan untuk melakukan pemformatan untuk Anda. Anda hanya perlu meneruskan lokal yang tepat dan opsi untuk mencocokkan format yang tepat, yang sayangnya hanya didukung oleh browser modern (*) :

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

(Lihat juga Fiddle ini ).


(*) Menurut MDN , "Browser modern" berarti Chrome 24+, Firefox 29+, IE11, Edge12 +, Opera 15+ & Safari nightly build

John Slegers
sumber
3

Hanya pilihan lain, yang saya tulis:

Perpustakaan DP_DateExtensions

Tidak yakin apakah itu akan membantu, tapi saya merasa itu berguna dalam beberapa proyek - sepertinya itu akan melakukan apa yang Anda butuhkan.

Mendukung pemformatan tanggal / waktu, matematika tanggal (menambah / mengurangi bagian tanggal), membandingkan tanggal, penguraian tanggal, dll. Ini bersumber terbuka secara bebas.

Tidak ada alasan untuk mempertimbangkannya jika Anda sudah menggunakan kerangka kerja (mereka semua mampu), tetapi jika Anda hanya perlu dengan cepat menambahkan manipulasi tanggal ke proyek, beri kesempatan.

Jim Davis
sumber
2

Jika Anda hanya ingin menunjukkan waktu dengan dua digit, ini dapat membantu Anda:

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);
Usman Y
sumber
1

JsSimpleDateFormat adalah pustaka yang dapat memformat objek tanggal dan mem-parsing string yang diformat kembali ke objek Date. Ini menggunakan format Java (kelas SimpleDateFormat). Nama bulan dan hari dapat dilokalkan.

Contoh:

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

Jawabannya adalah "tidak ada di mana-mana" karena format tanggal adalah fungsi eksklusif. Saya tidak berpikir fungsi toString dimaksudkan untuk menyesuaikan dengan format tertentu. misalnya dalam spec ECMAScript 5.1 ( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf , 2/8/2013, halaman 173), fungsi toString didokumentasikan sebagai berikut :

"Isi String bergantung pada implementasi"

Fungsi seperti contoh di bawah ini dapat digunakan untuk menyelesaikan pemformatan dengan cukup mudah.

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");
}
goofballLogic
sumber
1

Jika Anda tidak memerlukan semua fitur yang disediakan oleh perpustakaan seperti Moment.js , maka Anda dapat menggunakan port of strftime saya . Ini ringan (1,35 KB vs 57,9 KB diperkecil dibandingkan dengan Moment.js 2.15.0) dan menyediakan sebagian besar fungsionalitas 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://stackoverflow.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;
  });
}

Penggunaan sampel:

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"

Kode terbaru tersedia di sini: https://github.com/thdoan/strftime

Terima kasih
sumber
0

Cara yang benar untuk memformat tanggal untuk mengembalikan "2012-12-29" adalah dengan skrip dari Format Tanggal JavaScript :

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

Kode ini TIDAK berfungsi:

var d1 = new Date();
d1.toString('yyyy-MM-dd');      
Sebastian Viereck
sumber
3
Anda memerlukan skrip yang ditautkan "Format Tanggal JavaScript" yang ditautkan di atas
Sebastian Viereck
0

Secara pribadi, karena saya menggunakan PHP dan jQuery / javascript dalam ukuran yang sama, saya menggunakan fungsi tanggal dari php.js http://phpjs.org/functions/date/

Menggunakan perpustakaan yang menggunakan string format yang sama dengan sesuatu yang sudah saya ketahui lebih mudah bagi saya, dan manual yang berisi semua kemungkinan format string untuk fungsi tanggal tentu saja online di php.net

Anda cukup memasukkan file date.js dalam HTML Anda menggunakan metode pilihan Anda kemudian menyebutnya seperti ini:

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

Anda dapat menggunakan d1.getTime () alih-alih valueOf () jika Anda mau, mereka melakukan hal yang sama.

Membagi dengan 1000 dari timestamp javascript adalah karena cap waktu javascript dalam milidetik tetapi timestamp PHP dalam hitungan detik.

Cloudranger
sumber
0

Banyak kerangka kerja (yang mungkin sudah Anda gunakan) memiliki format tanggal yang mungkin tidak Anda sadari. jQueryUI sudah disebutkan, tetapi kerangka kerja lain seperti Kendo UI (Globalisasi) , Yahoo UI (Util) dan AngularJS memilikinya juga.

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

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