Làm cách nào để sử dụng .toLocaleTimeString () mà không hiển thị giây?


162

Tôi hiện đang cố gắng hiển thị thời gian của người dùng mà không hiển thị giây. Có cách nào tôi có thể làm điều này bằng cách sử dụng .toLocaleTimeString () của Javascript không?

Làm một cái gì đó như thế này:

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

sẽ hiển thị thời gian của người dùng với mọi đơn vị, ví dụ như hiện tại nó hiển thị 3:39:15 PM. Tôi có thể hiển thị cùng một chuỗi, chỉ cần không có giây không? (ví dụ: 3:39 chiều)

Câu trả lời:


316

Bạn luôn có thể đặt các tùy chọn, dựa trên trang này bạn có thể đặt, để thoát khỏi giây, một cái gì đó như thế này

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

Được hỗ trợ bởi Firefox, Chrome, IE9 + và Opera. Hãy thử nó trên bảng điều khiển trình duyệt web của bạn.


2
Cảm ơn, tôi đã tìm kiếm hàng giờ cho câu trả lời này.
MustafaP

5
FYI hour: "2-digit"không hoạt động với tôi trong Chrome 42 và FF 37 --- d = new Date(1429524912495).toLocaleTimeString('en-US', {hour: '2-digit', minute: '2-digit', hour12: true})trả về "6:15 AM"cả hai.
dùng9645

16
sử dụng []để rời khỏi một địa phương cụ thể. Bằng cách đó, bạn sẽ ở lại địa điểm người dùng:toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'}
Hafenkranich

12
hoạt động trong chrome 51:new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit', hour12: false}); "17:08"
rofrol

1
Vâng, đã 4 năm kể từ khi tôi đăng bài này ở đây, rất nhiều điều đã thay đổi. Không có gì ngạc nhiên khi bạn không còn cần phải chỉ định nó. Trân trọng
CJLopez

10

Điều này làm việc cho tôi:

var date = new Date();
var string = date.toLocaleTimeString([], {timeStyle: 'short'});

6
Điều đáng chú ý là, kể từ tháng 3 năm 2020, tùy chọn timeStyle chỉ được hỗ trợ trong Chrome và Opera chứ không phải trong Firefox, Edge / IE và Safari. Nếu bạn muốn phủ sóng rộng, có lẽ tốt hơn nên gắn bó với các tùy chọn giờ và phút bây giờ.
Buckthorn

Đối với Safari / iOS, tính năng này chỉ hoạt động ở Hoa Kỳ nơi bạn có AM / PM. en-US sẽ hiển thị 3:16 PM, các địa phương khác sẽ hiển thị 15:16:00.
PassKit

8

Giá trị được trả về bởi Date.prototype.toLocaleString phụ thuộc vào việc triển khai, do đó bạn nhận được những gì bạn nhận được. Bạn có thể thử phân tích chuỗi để loại bỏ giây, nhưng nó có thể khác nhau trong các trình duyệt khác nhau, do đó bạn cần phải có trợ cấp cho mọi trình duyệt đang sử dụng.

Tạo định dạng rõ ràng, riêng của bạn không khó bằng các phương thức Date. Ví dụ:

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

7
KHÔNG phân tích chuỗi được trả về từ toLocaleTimeString. Tôi đã được một vài năm mà không có vấn đề gì. Nhưng hôm nay tôi nhận thấy nó không hoạt động. Hóa ra có các ký tự unicode đặc biệt (ví dụ 0x200E, dấu từ trái sang phải) không thể được xử lý bởi Date.parse. Chưa bao giờ thấy điều đó đến. Vì vậy, tôi sẽ ngừng sử dụng tất cả các hàm cục bộ và chỉ xây dựng các chuỗi định dạng thời gian của riêng tôi. Điều đó sẽ cứu tôi khỏi những bất ngờ xấu xa như thế này.
Gabe Halsmer 16/12/13

@ GabeHalsmer, tôi không, và không bao giờ, khuyên bạn nên cho phép Date.parse phân tích các chuỗi (ví dụ đoạn cuối ở đây ). Nhưng điều đó không liên quan ở đây, nó hoàn toàn không được đề cập, bạn đã hiểu sai câu trả lời nếu bạn nghĩ vậy (ví dụ: " Bạn có thể thử phân tích cú pháp").
RobG

Liên kết tốt đẹp. Vì vậy, tóm lại, mọi người phải tự phân tích cú pháp hoặc phương thức ToString của riêng họ, vì về cơ bản Date.prototype.toLocalString và Date.parse không tương thích. Làm một ToString dường như là điều dễ nhất đối với tôi. Nhưng bạn đã thực hiện phân tích riêng của bạn. Vì vậy, hoặc sẽ làm việc cho mọi người. Điều cốt yếu mà tôi muốn làm cho mọi người biết là Date.parse không hoạt động với toLocaleString. Và tôi đã mất hàng giờ để tìm ra sự không tương thích này vì nó tinh tế đến mức nào. Các dấu từ trái sang phải là vô hình trong trình gỡ lỗi của Visual Studio.
Gabe Halsmer

Thật tuyệt, một người khác hoàn toàn sai lầm bỏ phiếu. Không có gì ngạc nhiên khi mọi người không muốn đặt tên của họ cho họ.
RobG

Để lưu trữ và vận chuyển ngày đến các định dạng khác, toISOString và getTime có thể cung cấp định dạng ngày an toàn nhất để sửa chữa lại. Tôi không biết về bất kỳ triển khai JS nào trong thập kỷ qua không xử lý phiên bản UTC trong một phần nghìn giây được trả về từ getTime và các giá trị ISO cũng nằm trong thông số kỹ thuật dưới dạng định dạng ngày có thể phân tích được trong một thời gian ngắn. Nhưng không bao giờ đọc lại ngày từ các yếu tố UI. Điều đó sẽ đến từ lớp ứng dụng của bạn. Và luôn luôn kiểm tra trong Safari. Họ đã bị giật cấp IE6 về đối tượng ngày.
Erik Reppen

7

Với các địa phương:

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

0

Tôi cũng đã tìm kiếm giải pháp cho vấn đề này, đây là những gì cuối cùng tôi đã nghĩ ra:

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

Bạn có thể dùng thử tại đây: http://jsfiddle.net/B5Zrx/

\ u200E là một số ký tự định dạng mà tôi đã thấy trên một số phiên bản IE (đó là unicode đánh dấu từ trái sang phải).

Tôi giả sử rằng nếu thời gian được định dạng chứa thứ gì đó như "XX: XX: XX" thì đó phải là thời gian bằng giây và tôi xóa phần cuối cùng, nếu tôi không tìm thấy mẫu này, không có gì thay đổi. Khá an toàn, nhưng có nguy cơ để lại vài giây trong một số trường hợp kỳ lạ.

Tôi chỉ hy vọng rằng không có miền địa phương nào có thể thay đổi thứ tự các phần thời gian được định dạng (ví dụ: làm cho nó ss: mm: hh). Dấu từ trái sang phải này khiến tôi hơi lo lắng về điều đó, đó là lý do tại sao tôi không xóa dấu từ phải sang trái (\ u202E) - Tôi không muốn tìm thấy kết quả khớp trong trường hợp này và rời khỏi thời gian được định dạng bằng giây trong trường hợp đó.


1
+1 Bạn là người duy nhất trả lời đúng câu hỏi. Cảm ơn bạn đời
mate64

1
Điều này đưa ra rất nhiều giả định về những gì toLocaleTimeString()trả về có thể không đúng với tất cả các địa phương.
AJ Richardson

0

Bạn có thể thử điều này, đang làm việc cho nhu cầu của tôi.

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

hoặc là

d.toLocaleString().replace(/:\d{2}\s/,' ');

6
Điều này sẽ không hoạt động vì các ngôn ngữ khác có thể sử dụng một dấu tách hoàn toàn khác so với :.
Jon Koops

-2

Đây là một chức năng sẽ làm điều đó, với các ý kiến ​​giải thích:

  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
  }

Vì, như những người khác đã lưu ý, toLocaleTimeString () có thể được triển khai khác nhau trong các trình duyệt khác nhau, cách này giúp kiểm soát tốt hơn.

Để tìm hiểu thêm về đối tượng Ngày Javascript, đây là một tài nguyên tốt: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date


-2

Tôi nghĩ rằng câu hỏi ban đầu có thể dễ dàng được trả lời với một cái gì đó bị bỏ qua cho đến nay: một chuỗi tách đơn giản. Thời gian được trả về là một chuỗi văn bản, chỉ cần phân tách nó trên dấu phân cách ":" và lắp lại chuỗi theo cách bạn muốn. Không cắm, không có kịch bản phức tạp. và ở đây ya đi:

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

-3

Mặc dù đây là một câu hỏi cũ hơn, gần đây tôi đã có một câu hỏi tương tự, và đã đưa ra một giải pháp đơn giản hơn bằng cách sử dụng các biểu thức thông thường và hàm thay thế chuỗi như một cách thay thế khác (không cần thư viện js bên ngoài hoặc phụ thuộc vào API nội bộ ECMAScript) :

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

Cách tiếp cận này sử dụng giao diện regex phía trước để lấy phần cuối: ss AM / PM của chuỗi và thay thế phần: ss bằng một khoảng trắng, trả lại phần còn lại của chuỗi chưa được chạm. (Nghĩa đen là "Tìm một dấu hai chấm có hai chữ số và một khoảng trắng được theo sau bởi AM hoặc PM và thay thế dấu hai chấm, hai chữ số và phần không gian chỉ bằng một khoảng trắng).

Biểu thức / cách tiếp cận này chỉ hoạt động đối với các Địa điểm giống như Hoa Kỳ và en-US. Nếu bạn cũng muốn có một kết quả tương tự, giả sử, tiếng Anh Anh (en-GB), không sử dụng AM / PM, thì cần có một biểu thức chính quy khác.

Dựa trên đầu ra mẫu của người hỏi ban đầu, tôi cho rằng họ chủ yếu giao dịch với khán giả Mỹ và lược đồ thời gian của Hoa Kỳ.


-3

Đơn giản chỉ cần chuyển đổi ngày thành một chuỗi, và sau đó nối các chuỗi con bạn muốn từ chuỗi đó.

let time = date.toLocaleTimeString();
console.log(time.substr(0, 4) + time.substr(7, 3))
//=> 5:45 PM

3
Vui lòng thêm một số lời giải thích cho bài viết của bạn.
DigitCart

5
toLocaleTimeStringtrả về chuỗi khác nhau trên mỗi trình duyệt tùy thuộc vào cài đặt ngôn ngữ. Bạn không thể dựa vào các vị trí này, bạn sẽ nhận được các kết quả khác nhau, có thể bị hỏng trên các trình duyệt của người khác.
oriadam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.