Cách chuyển đổi giây sang HH: mm: ss trong moment.js


93

Làm cách nào để chuyển đổi giây thành HH:mm:ss?

Hiện tại tôi đang sử dụng chức năng bên dưới

render: function (data){
     return new Date(data*1000).toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");;
}

Điều này hoạt động trên chrome nhưng trong firefox trong 12 giây, tôi nhận được, 01:00:12 tôi muốn sử dụng moment.js để tương thích với nhiều trình duyệt

Tôi đã thử điều này nhưng không hoạt động

render: function (data){
         return moment(data).format('HH:mm:ss');
}

Tôi đang làm gì sai?

BIÊN TẬP

Tôi đã cố gắng tìm ra giải pháp mà không cần moment.js, như sau

return (new Date(data * 1000)).toUTCString().match(/(\d\d:\d\d:\d\d)/)[0];

Vẫn tò mò về cách tôi có thể làm điều đó trong giây lát.js



@mplungjan Xin lỗi vì đã không đề cập rằng tôi đã đọc bài đăng đó. Tôi cần kết xuất một bảng có hàng triệu hàng và giải pháp ở đó quá chậm. câu trả lời thứ hai là chính xác những gì tôi đã viết trong câu hỏi của tôi, nhưng mang lại cho tôi những vấn đề trong firefox
QGA

2
@QuentinTanioartino như vậy 4 toán tử toán học tầm thường là một vấn đề cho nhiệm vụ gây đột biến DOM cho hàng triệu phần tử? Bạn có chắc mình hiểu đúng vấn đề về hiệu suất không?
zerkms

@zerkms tôi biết rằng các lớp DAO của tôi phải được viết lại để phục vụ dữ liệu đã được chuyển đổi. Đây là một vấn đề tôi đã biết. Cho biết rằng tôi khá hài lòng với hiệu suất hiện tại của lần thử đầu tiên nhưng khi tôi có 5 phép toán cho một chuyển đổi khiến hệ thống bị chậm một chút. Có, tôi đồng ý với bạn rằng đây chỉ là một giải pháp tạm thời nhanh chóng
QGA

@QuentinTanioartino "làm chậm hệ thống một chút" --- "một chút" không phải là cách bạn giải thích về hiệu suất. Nó có phải là một nút cổ chai? Nó có được chứng minh là một điểm nghẽn? Nếu không - điều gì thúc đẩy bạn tối ưu hóa chính hoạt động này?
zerkms

Câu trả lời:


78

Từ bài đăng này, tôi sẽ thử điều này để tránh các vấn đề nhảy vọt

moment("2015-01-01").startOf('day')
    .seconds(s)
    .format('H:mm:ss');

Tôi đã không chạy jsPerf, nhưng tôi sẽ nghĩ điều này nhanh hơn việc tạo các đối tượng ngày mới một triệu lần

function pad(num) {
    return ("0"+num).slice(-2);
}
function hhmmss(secs) {
  var minutes = Math.floor(secs / 60);
  secs = secs%60;
  var hours = Math.floor(minutes/60)
  minutes = minutes%60;
  return `${pad(hours)}:${pad(minutes)}:${pad(secs)}`;
  // return pad(hours)+":"+pad(minutes)+":"+pad(secs); for old browsers
}


2
Cảm ơn rất nhiều, giải pháp rất thông minh
QGA

1
Cái thứ hai, Nó cực kỳ nhanh
QGA

1
Bạn có thể làm điều này trong ví dụ thứ hai: sự trở lại [giờ, phút, giây] .filter (t => t) .map (pad) .join ( ":")
Onno Faber

@OnnoFaber Bạn nghĩ gì là nhanh nhất? nối hoặc một bộ lọc cộng với một bản đồ? Chúng tôi cũng có thể làm`${pad(hours)}:${pad(minutes)}:${pad(secs)}`
mplungjan

Từ tất cả các câu trả lời trước đây, câu trả lời đơn giản nhất là câu trả lời của mplungjan , nhưng nó có lỗi hiển thị số ngẫu nhiên nếu giá trị có mili giây (ví dụ: 17,3 s). Dựa trên mã của anh ấy, tôi đề xuất như sau: function pad (num) {return ("0" + num) .slice (-2); } / ** * @return {string} * / xuất hàm mặc định renderUserTime (giây) {let minutes = Math.floor (seconds / 60); const outputSecs = Math.round (giây% 60); để giờ = Math.floor (phút / 60); const outputMinutes = Math.round (phút% 60); return `$ {pad (giờ)}: $ {pad (outputMi
Alberto Soto

94

Điều này tương tự với câu trả lời mplungjan được tham khảo từ một bài đăng khác, nhưng ngắn gọn hơn:

const secs = 456;

const formatted = moment.utc(secs*1000).format('HH:mm:ss');

document.write(formatted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

Nó cũng có những cảnh báo tương tự, ví dụ: nếu giây vượt quá một ngày (86400), bạn sẽ không nhận được những gì bạn mong đợi.


1
cảm ơn bạn, tôi nghĩ đây là một nhu cầu rất phổ biến, hãy mở một yêu cầu kéo để moment.js họ nên kết hợp nó.
Morris S

Cảm ơn @Sophie. Rất ít nơi đề cập đến utc (), đó là chính xác những gì cần thiết trong trường hợp của tôi.
pmont

24

Bạn có thể sử dụng plugin định dạng thời lượng khoảnh khắc :

var seconds = 3820;
var duration = moment.duration(seconds, 'seconds');
var formatted = duration.format("hh:mm:ss");
console.log(formatted); // 01:03:40
<!-- Moment.js library -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

<!-- moment-duration-format plugin -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/1.3.0/moment-duration-format.min.js"></script>

Xem thêm Fiddle này

Cập nhật: Để tránh bị cắt cho các giá trị dưới 60 giây, hãy sử dụng { trim: false }:

var formatted = duration.format("hh:mm:ss", { trim: false }); // "00:00:05"

Có một sự đánh đổi cần được xem xét với câu trả lời của bạn và câu trả lời của @ sophie. Mặc dù về mặt kỹ thuật, giải pháp của bạn sẽ hiển thị khoảng thời gian "Thời gian" là hh: mm: ss, nó yêu cầu plugin bổ sung. Sophie's là "Ngày" tính từ thời điểm hiện tại được định dạng thành hh: mm: ss. Nếu bạn xóa "utc" khỏi Sophie, nó có thể trả về thông tin không chính xác vì nó sử dụng kỷ nguyên làm ngày chứ không phải thời điểm hiện tại. Cả hai câu trả lời đều hoạt động. Chỉ là một cái gì đó để suy nghĩ về và hiểu.
Michael

Mặc dù ở đây sử dụng CDN và điều gì không thể làm tăng độ trễ, nhưng nói chung là nguy hiểm khi nghĩ rằng "bao gồm một thư viện khác" như một sự đánh đổi tiêu cực so với việc tự triển khai mã. Đây là một cái bẫy mà tôi thấy nhiều nhà phát triển rơi vào và cuối cùng kết thúc với mã ít có thể bảo trì hơn.
cytinus

vì một số lý do nếu giây <60 thì nó chỉ kết thúc không được định dạng
Daniel Lizik

@DanielLizik, chỉ cần thêm {trim: false}. Vd: length.format ("hh: mm: ss", {trim: false});
Oleksiy Kachynskyy

16
var seconds = 2000 ; // or "2000"
seconds = parseInt(seconds) //because moment js dont know to handle number in string format
var format =  Math.floor(moment.duration(seconds,'seconds').asHours()) + ':' + moment.duration(seconds,'seconds').minutes() + ':' + moment.duration(seconds,'seconds').seconds();

1

Làm thế nào để sử dụng đúng thời lượng moment.js? | Sử dụng moment.duration () trong mã

Đầu tiên, bạn cần nhập momentmoment-duration-format.

import moment from 'moment';
import 'moment-duration-format';

Sau đó, sử dụng hàm thời lượng. Chúng ta hãy áp dụng ví dụ trên: 28800 = 8 giờ sáng.

moment.duration(28800, "seconds").format("h:mm a");

🎉Vâng, bạn không mắc phải lỗi loại trên. 🤔 Bạn có nhận được đúng giá trị lúc 8 giờ sáng không? Không…, giá trị bạn nhận được là 8h00 a. Định dạng Moment.js không hoạt động như dự kiến.

💡 Giải pháp là chuyển đổi giây thành mili giây và sử dụng thời gian UTC.

moment.utc(moment.duration(value, 'seconds').asMilliseconds()).format('h:mm a')

Được rồi, bây giờ chúng ta có 8 giờ sáng. Nếu bạn muốn 8 giờ sáng thay vì 8 giờ sáng cho thời gian tích hợp, chúng tôi cần thực hiện RegExp

const time = moment.utc(moment.duration(value, 'seconds').asMilliseconds()).format('h:mm a');
time.replace(/:00/g, '')

1

Cho đến 24 giờ. Như Duration.formatkhông được dùng nữa, với moment@2.23.0

const seconds = 123;
moment.utc(moment.duration(seconds,'seconds').as('milliseconds')).format('HH:mm:ss');
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.