Chuyển đổi chuỗi HH: MM: SS thành giây chỉ trong javascript


97

Tôi gặp phải yêu cầu tương tự như sau: Chuyển đổi thời gian ở định dạng HH: MM: SS thành chỉ giây?

nhưng trong javascript. Tôi đã thấy nhiều ví dụ về chuyển đổi giây thành các định dạng khác nhau nhưng không phải HH: MM: SS thành giây. Bất kỳ trợ giúp sẽ được đánh giá cao.


rất tiếc .. xin lỗi vì lỗi đánh máy. vâng, đã đến giờ rồi: mm: ss
Sri Reddy.

Là gì DDtrong HH:MM:DD?
Brian Driscoll

2
Đó là thuật toán tương tự như trong câu hỏi PHP đó.
scottheckel

Chà .. H (Giờ) == 3600 giây, M (phút) == 60 giây ... vậy ..
MilkyWayJoe

1
Giải pháp duy nhất tôi nghĩ đến là tách chuỗi trong mảng và sau đó nhân 3600 với giờ và nhân 60 với phút và cộng tất cả với phần giây. Đây có phải là giải pháp đơn giản nhất?
Sri Reddy

Câu trả lời:


192

Thử cái này:

var hms = '02:04:33';   // your input string
var a = hms.split(':'); // split it at the colons

// minutes are worth 60 seconds. Hours are worth 60 minutes.
var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); 

console.log(seconds);

3
Đây là phiên bản nguyên mẫu của cái này! String.prototype.toSeconds = function () { if (!this) return null; var hms = this.split(':'); return (+hms[0]) * 60 * 60 + (+hms[1]) * 60 + (+hms[2] || 0); } LƯU Ý: || 0ở cuối là tốt cho bất kỳ triển khai nào của mã này - nó ngăn chặn các vấn đề với biểu diễn thời gian (vẫn hợp lệ) của HH: MM (đầu vào Chrome type = "time" sẽ xuất ra ở định dạng này khi giây = 0).
Fateh Khalsa

Công cụ tuyệt vời anh bạn
edward

Tôi chỉ hh:mmkhông có secondstrong trường hợp này những gì tôi phải sửa đổi ..?
Mr world wide

1
@AbdulWaheed Thay đổi dòng này: var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); thànhvar seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
Rova

4
Việc sử dụng toán tử "+" để chuyển đổi chuỗi số thành số không phải là một ý kiến ​​hay. Nó ngắn và trông "thông minh", nhưng nó khó hiểu và mã không sạch. Sử dụng parseInt (x, 10) để thay thế. Và tránh một lớp lót. Đồng thời ngăn ngừa lỗi bằng đầu vào không xác định. Ví dụ: nó không phải là một chuỗi, không có ":" hoặc chỉ có "HH: MM". vv
Dominik

67

Hàm này xử lý "HH: MM: SS" cũng như "MM: SS" hoặc "SS".

function hmsToSecondsOnly(str) {
    var p = str.split(':'),
        s = 0, m = 1;

    while (p.length > 0) {
        s += m * parseInt(p.pop(), 10);
        m *= 60;
    }

    return s;
}

Tốt, tôi sẽ giữ nó nếu yêu cầu về thời gian trôi qua là bất kỳ định dạng nào. Cảm ơn!
Sri Reddy

Câu trả lời tốt nhất cho tôi cho đến nay
Rezwan Azfar Haleem

Câu trả lời này rất hữu ích
Mike Aron

Tôi cần thay đổi điều gì trong chức năng của bạn để chỉ sử dụng ở định dạng 'HH: MM'
noyruto88

35

Điều này có thể được thực hiện khá bền bỉ với những điều sau:

'01:02:03'.split(':').reduce((acc,time) => (60 * acc) + +time);

Điều này là do mỗi đơn vị thời gian trong giờ, phút và giây là bội số của 60 lớn hơn đơn vị nhỏ hơn. Thời gian được chia thành các thành phần giờ phút và giây, sau đó giảm xuống giây bằng cách sử dụng giá trị tích lũy của các đơn vị cao hơn nhân với 60 khi nó đi qua mỗi đơn vị.

Các +timeđược sử dụng để đúc thời gian để một số.

Về cơ bản, nó kết thúc bằng việc: (60 * ((60 * HHHH) + MM)) + SS

Nếu chỉ giây được trôi qua thì kết quả sẽ là một chuỗi, vì vậy để khắc phục chúng ta có thể truyền toàn bộ kết quả thành một int:

+('03'.split(':').reduce((acc,time) => (60 * acc) + +time));

thats thực sự khá nguyền rủa thông minh .. câu hỏi là điều này được so sánh với một tính toán nhanh như thế nào
ThatBrianDude

4
Vâng, nó thông minh, nhưng là một ví dụ điển hình về việc tạo mã khó bảo trì mà không mang lại lợi ích thiết thực. Nó lưu 4 ký tự khi được thu nhỏ so với phiên bản thu nhỏ của câu trả lời được chấp nhận. Do nhiều trang web hiện đã vượt quá 1MB, việc tiết kiệm đó có phần ít hơn không đáng kể.
RobG

4
Mặc dù câu trả lời này không phải là dễ hiểu, nó không duyên dáng xử lý cả hai HH:MM:SScũng như MM:SS, trong khi câu trả lời được chấp nhận không.
ckeeney

1
Cái này có một lỗi chuyển đổi loại, nếu chỉ có phần giây được đưa ra. Bạn cần loại bỏ rõ ràng ghi nhớ bằng 0 để ngăn chặn nó. Công trình: '03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);Thất bại vì lợi nhuận một chuỗi bất ngờ:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
Felix Gertz

@FelixGertz Được phát hiện tốt, tôi sẽ chỉnh sửa trong một bản sửa lỗi cho trường hợp đó.
Paul

12

Vì hàm getTime của đối tượng Date lấy phần nghìn giây kể từ ngày 1970/01/01, chúng ta có thể thực hiện điều này:

var time = '12:23:00';
var seconds = new Date('1970-01-01T' + time + 'Z').getTime() / 1000;

1
Chỉ cần nhận ra, điều này không hoạt động với thời gian tiết kiệm ánh sáng ban ngày. Nhu cầu sử dụng ngày thực tế
Yablargo

1
@Yablargo Cảm ơn. Phiên bản trước không hoạt động tốt với múi giờ địa phương, vì vậy tôi đã chỉnh sửa nó để sử dụng định dạng ngày giờ iso 8601 utc.
boskop

12

Chuyển đổi hh:mm:sschuỗi thành giây trong một dòng. Cũng được phép h:m:sđịnh dạng và mm:ss, m:sv.v.

'08:45:20'.split(':').reverse().reduce((prev, curr, i) => prev + curr*Math.pow(60, i), 0)

4
Vui lòng giải thích câu trả lời của bạn
B001 ᛦ

Chuyển đổi hh:mm:sschuỗi thành giây trong một dòng. Cũng được phép h:m:sđịnh dạng và mm:ss, m:sv.v.
Paul Hide

Câu trả lời hay! Nhưng bạn có thể bỏ qua reverse(): '00: 01: 11'.split (':'). Reduce ((val, entry, i) => val + entry * (3600 / Math.pow (60, i)), 0 ) === 71
CMR

@CMR, aproach thú vị, nhưng trong trường hợp mm:ssnó sẽ không hoạt động chính xác.
Paul Hide

Math.pow rất chậm và có thể tránh được như được hiển thị trong các câu trả lời khác dựa trên giảm
Alejadro Xalabarder

8

thử

time="12:12:12";
tt=time.split(":");
sec=tt[0]*3600+tt[1]*60+tt[2]*1;

5
ah, mà * 1 là một cách thông minh để có được nó không phải để làm nối chuỗi :)
Dagg Nabbit

5

Phương thức tĩnh của Javascript Date.UTC()thực hiện thủ thuật:

alert(getSeconds('00:22:17'));

function getSeconds(time)
{
    var ts = time.split(':');
    return Date.UTC(1970, 0, 1, ts[0], ts[1], ts[2]) / 1000;
}

4

Đây có thể là một biểu mẫu dễ đọc hơn một chút về câu trả lời được phê duyệt ban đầu.

const getSeconds = (hms: string) : number => {
  const [hours, minutes, seconds] = hms.split(':');
  return (+hours) * 60 * 60 + (+minutes) * 60 + (+seconds);
};

2
new Date(moment('23:04:33', "HH:mm")).getTime()

Đầu ra: 1499755980000 (tính bằng mili giây) (1499755980000/1000) (tính bằng giây)

Lưu ý: đầu ra này tính toán khác từ 1970-01-01 12: 0: 0 đến nay và chúng ta cần triển khai moment.js


OP hỏi cho giây không mili giây
user7294900

Hi user7294900, Thx cho bình luận của bạn tôi sẽ cập nhật câu trả lời của tôi, JST chúng ta cần chia 1000
ITsDEv

1

Chức năng này cũng hoạt động cho MM: SS:

const convertTime = (hms) => {
        if (hms.length <3){
         return hms
        } else if (hms.length <6){
          const a = hms.split(':')
          return hms = (+a[0]) * 60 + (+a[1])
        } else {
          const a = hms.split(':')
          return hms = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2])
        }
      }


1

Lấy từ giải pháp được đưa ra bởi Paul https://stackoverflow.com/a/45292588/1191101 nhưng sử dụng ký hiệu chức năng cũ nên nó cũng có thể được sử dụng trong các công cụ js khác (ví dụ: java Rhino)

function strToSeconds (stime)
{
   return +(stime.split(':').reduce(function (acc,time) { return +(60 * acc) + +time }));
}

hoặc chỉ cái này dễ đọc hơn

function strToSeconds (stime)
{
  var tt = stime.split(':').reverse ();
  return ((tt.length >= 3) ? (+tt[2]): 0)*60*60 + 
         ((tt.length >= 2) ? (+tt[1]): 0)*60 + 
         ((tt.length >= 1) ? (+tt[0]): 0);
}

0

function parsehhmmsst(arg) {
	var result = 0, arr = arg.split(':')
	if (arr[0] < 12) {
		result = arr[0] * 3600 // hours
	}
	result += arr[1] * 60 // minutes
	result += parseInt(arr[2]) // seconds
	if (arg.indexOf('P') > -1) {  // 8:00 PM > 8:00 AM
		result += 43200
	}
	return result
}
$('body').append(parsehhmmsst('12:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('1:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('2:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('3:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('4:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('5:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('6:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('7:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('8:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('9:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('10:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('11:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('12:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('1:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('2:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('3:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('4:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('5:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('6:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('7:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('8:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('9:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('10:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('11:00:00 PM') + '<br>')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


0

Bạn có thể thực hiện điều này một cách linh hoạt - trong trường hợp bạn gặp phải không chỉ: HH: mm: ss, mà còn, mm: ss, hoặc thậm chí chỉ ss.

var str = '12:99:07';
var times = str.split(":");
times.reverse();
var x = times.length, y = 0, z;
for (var i = 0; i < x; i++) {
    z = times[i] * Math.pow(60, i);
    y += z;
}
console.log(y);
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.