Bagaimana cara menggunakan .toLocaleTimeString () tanpa menampilkan detik?

163

Saat ini saya mencoba untuk menampilkan waktu pengguna tanpa menampilkan detik. Apakah ada cara saya bisa melakukan ini menggunakan Javascript .toLocaleTimeString ()?

Melakukan sesuatu seperti ini:

var date = new Date();
var string = date.toLocaleTimeString();

akan menampilkan waktu pengguna dengan setiap unit, misalnya saat ini menampilkan 3:39:15 PM. Apakah saya dapat menampilkan string yang sama, hanya tanpa detik? (mis. 15:39)

javadog36
sumber

Jawaban:

317

Anda selalu dapat mengatur opsi, berdasarkan halaman ini Anda dapat mengatur, untuk menghilangkan detik, seperti ini

var dateWithouthSecond = new Date();
dateWithouthSecond.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'});

Didukung oleh Firefox, Chrome, IE9 + dan Opera. Cobalah di konsol browser web Anda.

CJLopez
sumber
2
Terima kasih, saya mencari berjam-jam untuk jawaban ini.
MustafaP
5
FYI hour: "2-digit"tidak bekerja untuk saya di Chrome 42 atau FF 37 --- d = new Date(1429524912495).toLocaleTimeString('en-US', {hour: '2-digit', minute: '2-digit', hour12: true})mengembalikan "6:15 AM"keduanya.
user9645
16
gunakan []untuk meninggalkan lokal tertentu. Dengan begitu Anda tetap berada di lokal pengguna:toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'}
Hafenkranich
12
bekerja di chrome 51:new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit', hour12: false}); "17:08"
rofrol
1
ya, sudah 4 tahun sejak saya memposting ini di sini, banyak hal telah berubah. Tidak heran Anda tidak perlu lagi menentukannya. Salam
CJLopez
10

Ini bekerja untuk saya:

var date = new Date();
var string = date.toLocaleTimeString([], {timeStyle: 'short'});
Floris Looijesteijn
sumber
6
Perlu dicatat bahwa, pada Maret 2020, opsi timeStyle hanya didukung di Chrome dan Opera , dan tidak di Firefox, Edge / IE, dan Safari. Jika Anda ingin jangkauan luas, mungkin lebih baik tetap menggunakan opsi jam dan menit untuk saat ini.
buckthorn
Untuk Safari / iOS, ini hanya berfungsi di AS di mana Anda memiliki AM / PM. id-AS akan menampilkan 15:16, lokal lainnya akan menampilkan 15:16:00.
PassKit
8

Nilai dikembalikan oleh Date.prototype.toLocaleString bergantung pada implementasi, sehingga Anda mendapatkan apa yang Anda dapatkan. Anda dapat mencoba mengurai string untuk menghapus detik, tetapi mungkin berbeda di browser yang berbeda sehingga Anda harus membuat kelonggaran untuk setiap browser yang digunakan.

Membuat format Anda sendiri, tidak ambigu, tidak sulit menggunakan metode Tanggal. Sebagai contoh:

function formatTimeHHMMA(d) {
  function z(n){return (n<10?'0':'')+n}
  var h = d.getHours();
  return (h%12 || 12) + ':' + z(d.getMinutes()) + ' ' + (h<12? 'AM' :'PM');
}
RobG
sumber
7
JANGAN menguraikan string yang dikembalikan dari toLocaleTimeString. Saya telah selama beberapa tahun tanpa masalah. Tapi kemudian hari ini saya perhatikan itu tidak berfungsi. Ternyata ada karakter unicode khusus (misalnya 0x200E, tanda kiri-ke-kanan) yang tidak dapat diproses oleh Date.parse. Tidak pernah melihat ITU datang. Jadi saya akan berhenti menggunakan semua fungsi lokal, dan hanya membangun string saya sendiri yang diformat waktu. Itu akan menyelamatkan saya dari kejutan jahat seperti ini.
Gabe Halsmer
@ GabeHalsmer — Saya tidak, dan tidak pernah, merekomendasikan untuk mengizinkan Date.parse mengurai string (misalnya paragraf terakhir di sini ). Tapi itu tidak relevan di sini, tidak disebutkan sama sekali, Anda telah salah paham jawabannya jika menurut Anda itu (mis. " Anda dapat mencoba menguraikan ...").
RobG
Tautan yang bagus. Jadi secara ringkas orang harus membuat parse sendiri atau metode ToString mereka sendiri, karena Date.prototype.toLocalString dan Date.parse pada dasarnya tidak kompatibel. Membuat ToString sepertinya adalah hal yang paling mudah untuk saya lakukan. Tapi Anda sudah menerapkan parse Anda sendiri. Begitu juga akan bekerja untuk orang. Hal penting yang saya ingin membuat semua orang sadar adalah Date.parse tidak bekerja dengan toLocaleString. Dan saya butuh berjam-jam untuk melacak ketidakcocokan ini karena betapa halusnya itu. Tanda Kiri-ke-Kanan tidak terlihat dalam debugger Visual Studio.
Gabe Halsmer
Keren, suara yang sama sekali salah arah. Tidak heran orang tidak mau menyebut nama mereka.
RobG
Untuk penyimpanan dan pengangkutan tanggal ke format lain, toISOString dan getTime mungkin menyediakan format tanggal teraman untuk reparasi. Saya tidak mengetahui adanya implementasi JS dalam dekade terakhir yang tidak menangani versi milidetik UTC yang dikembalikan dari getTime dan nilai-nilai ISO juga telah dalam spesifikasi sebagai format tanggal yang dapat diuraikan untuk waktu yang lebih lama. Tapi jangan pernah baca tanggal kembali dari elemen UI. Itu harus datang dari lapisan aplikasi Anda. Dan selalu tes di Safari. Mereka telah menyentak tingkat IE6 tentang objek tanggal.
Erik Reppen
7

Dengan lokal:

var date = new Date();
date.toLocaleTimeString('fr-FR', {hour: '2-digit', minute: '2-digit'})
Mickael Austoni
sumber
0

Saya juga sudah mencari solusi untuk masalah ini, inilah yang akhirnya saya dapatkan:

function getTimeStr() {
    var dt = new Date();
    var d = dt.toLocaleDateString();
    var t = dt.toLocaleTimeString();
    t = t.replace(/\u200E/g, '');
    t = t.replace(/^([^\d]*\d{1,2}:\d{1,2}):\d{1,2}([^\d]*)$/, '$1$2');
    var result = d + ' ' + t;
    return result;
}

Anda dapat mencobanya di sini: http://jsfiddle.net/B5Zrx/

\ u200E adalah beberapa karakter pemformatan yang pernah saya lihat pada beberapa versi IE (ini adalah tanda unicode kiri-ke-kanan).

Saya berasumsi bahwa jika waktu yang diformat berisi sesuatu seperti "XX: XX: XX" maka itu harus waktu dengan detik dan saya menghapus bagian terakhir, jika saya tidak menemukan pola ini, tidak ada yang berubah. Cukup aman, tetapi ada risiko meninggalkan detik dalam beberapa keadaan aneh.

Saya hanya berharap bahwa tidak ada lokal yang akan mengubah urutan bagian waktu yang diformat (misalnya membuatnya ss: mm: hh). Tanda kiri-ke-kanan ini membuat saya sedikit gugup tentang itu, itu sebabnya saya tidak menghapus tanda kanan-ke-kiri (\ u202E) - Saya lebih suka tidak menemukan kecocokan dalam kasus ini dan meninggalkan waktu diformat dengan detik dalam kasus tersebut.

ag.
sumber
1
+1 Anda adalah satu - satunya , yang menjawab pertanyaan dengan benar. Terima kasih sobat
mate64
1
Ini membuat banyak asumsi tentang toLocaleTimeString()pengembalian apa yang mungkin tidak berlaku untuk semua lokal.
AJ Richardson
0

Anda dapat mencoba ini, yang berfungsi untuk kebutuhan saya.

var d = new Date();
d.toLocaleTimeString().replace(/:\d{2}\s/,' ');

atau

d.toLocaleString().replace(/:\d{2}\s/,' ');
karma
sumber
6
Ini tidak akan berhasil karena bahasa lain mungkin menggunakan pemisah yang sama sekali berbeda dari :.
Jon Koops
-2

Inilah fungsi yang akan melakukannya, dengan komentar yang menjelaskan:

  function displayNiceTime(date){
    // getHours returns the hours in local time zone from 0 to 23
    var hours = date.getHours()
    // getMinutes returns the minutes in local time zone from 0 to 59
    var minutes =  date.getMinutes()
    var meridiem = " AM"

    // convert to 12-hour time format
    if (hours > 12) {
      hours = hours - 12
      meridiem = ' PM'
    }
    else if (hours === 0){
      hours = 12
    }

    // minutes should always be two digits long
    if (minutes < 10) {
      minutes = "0" + minutes.toString()
    }
    return hours + ':' + minutes + meridiem
  }

Karena, seperti yang telah dicatat orang lain, toLocaleTimeString () dapat diimplementasikan secara berbeda di browser yang berbeda, cara ini memberikan kontrol yang lebih baik.

Untuk mempelajari lebih lanjut tentang objek Tanggal Javascript, ini adalah sumber yang bagus: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

koanima
sumber
-2

Saya pikir pertanyaan awal dapat dengan mudah dijawab dengan sesuatu yang diabaikan sejauh ini: perpecahan string sederhana. Waktu yang dikembalikan adalah string teks, cukup pisahkan di pembatas ":" dan pasang kembali string seperti yang Anda inginkan. Tidak ada plug in, tidak ada scripting yang rumit. dan ini dia:

var myVar=setInterval(function(){myTimer()},1000);

function myTimer() {
    var d = new Date();
    currentNow = d.toLocaleTimeString();
    nowArray = currentNow.split(':');
    filteredNow = nowArray[0]+':'+nowArray[1];
    document.getElementById("demo").innerHTML = filteredNow;
}
Frank Eastes
sumber
-3

Meskipun ini adalah pertanyaan yang lebih tua, saya memiliki yang sama sendiri baru-baru ini, dan muncul dengan solusi yang lebih sederhana menggunakan ekspresi reguler dan fungsi ganti string sebagai alternatif lain (tidak perlu untuk perpustakaan js eksternal atau mengandalkan API Internalisasi ECMAScript) :

var d = new Date();
var localeTime = d.toLocaleTimeString();
var localeTimeSansSeconds = localeTime.replace(/:(\d{2}) (?=[AP]M)/, " ");

Pendekatan ini menggunakan regex melihat-depan untuk mengambil: ss AM / PM akhir string dan mengganti bagian: ss dengan spasi, mengembalikan sisa string tidak tersentuh. (Secara harfiah mengatakan "Temukan titik dua dengan dua digit dan spasi yang diikuti oleh AM atau PM dan ganti titik dua, dua digit, dan bagian ruang hanya dengan spasi).

Ekspresi / pendekatan ini hanya berfungsi untuk Lokal en-AS dan en-AS. Jika Anda juga menginginkan hasil yang serupa dengan, katakanlah, British English (en-GB), yang tidak menggunakan AM / PM, diperlukan ekspresi reguler yang berbeda.

Berdasarkan output sampel kuesioner asli, saya berasumsi bahwa mereka terutama berurusan dengan audiens Amerika dan skema waktu en-AS.

Emu
sumber
-3

Cukup konversikan tanggal menjadi string, lalu gabungkan substring yang Anda inginkan.

let time = date.toLocaleTimeString();
console.log(time.substr(0, 4) + time.substr(7, 3))
//=> 5:45 PM
Bradley
sumber
3
Silakan tambahkan beberapa penjelasan ke posting Anda.
DigitCart
5
toLocaleTimeStringmengembalikan string yang berbeda pada setiap browser tergantung pada pengaturan lokal. Anda tidak dapat mengandalkan posisi ini, Anda akan mendapatkan hasil yang berbeda, mungkin rusak di browser orang lain.
oriadam