在JavaScript中将Unix时间戳转换为时间

1633

我将时间存储在MySQL数据库中作为Unix时间戳,并将其发送到一些JavaScript代码。如何从中获取仅时间?

例如,以HH/MM/SS格式。


24
由于JS时间戳是以毫秒为单位的,而PHP则是以秒为单位的,因此只需将其乘以1000即可。 - ankr
1
这是一个非常有用的链接,其中包含不同的日期格式:https://timestamp.online/article/how-to-convert-timestamp-to-datetime-in-javascript 结合乘以1000,它可以完成工作! - Kevin Lemaire
看看我是如何实现的:https://dev59.com/EWIk5IYBdhLWcg3wNru8#64089456 - Hidayt Rahman
如果您有一个不同日期格式的字符串,请参见JavaScript中将字符串解析为日期 - Sebastian Simon
dt = new Date(1234567890 * 1000).toLocaleString();可以得到日期和时间——或使用.toLocaleDateString()或.toLocaleTimeString()) - ashleedawg
34个回答

2296

let unix_timestamp = 1549312452;

// Create a new JavaScript Date object based on the timestamp
// multiplied by 1000 so that the argument is in milliseconds, not seconds
var date = new Date(unix_timestamp * 1000);

// Hours part from the timestamp
var hours = date.getHours();

// Minutes part from the timestamp
var minutes = "0" + date.getMinutes();

// Seconds part from the timestamp
var seconds = "0" + date.getSeconds();

// Will display time in 10:30:23 format
var formattedTime = hours + ':' + minutes.substr(-2) + ':' + seconds.substr(-2);

console.log(formattedTime);

有关Date对象的更多信息,请参考MDNECMAScript 5规范

128
在现代CPU上,乘法是微不足道的 - 字符串连接将需要更多的工作! - Alnitak
32
实际上,它将以“10:2:2”的格式显示时间,因为它不会在小于10的值之前添加额外的0。 - Fireblaze
19
乘法涉及数字,连接涉及字符串。计算机比字符串更有效地处理数字。 当进行字符串连接时,后台会进行大量的内存管理。(然而,如果你已经在进行字符串连接,那么在其中一个字符串中包含一些额外字符可能实际上比将两个数字相乘需要的一个处理器操作成本更低。) - Brilliand
9
计算数字是计算机最基本的任务,它们在内存和运行时间上都非常高效。Brilliand的评论很相关,尽管我认为他评论中的最后一部分完全是虚假的。 - Alnitak
5
所有语言都是如此(或者理论上可以创造出一种不同的奇特语言,不像这样)。“字符串”在内部存储为指向存储字符串内容的内存块的指针。与大多数数字在系统上使用的内存相同,指针本身使用的内存量,实际存储字符串的内存则是额外的。当您连接字符串时,通常会创建一个全新的字符串,其中包含两个字符串的组合内容。 - Brilliand
显示剩余15条评论

378

function timeConverter(UNIX_timestamp){
  var a = new Date(UNIX_timestamp * 1000);
  var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
  var year = a.getFullYear();
  var month = months[a.getMonth()];
  var date = a.getDate();
  var hour = a.getHours();
  var min = a.getMinutes();
  var sec = a.getSeconds();
  var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ;
  return time;
}
console.log(timeConverter(0));


对于HH/MM/SS,只需使用最后三个变量,并且此时间将以您的本地时间为准,但如果想获取UTC时间,则只需使用getUTC方法。以下是代码。 - shomrat
43
我使用了这个解决方案,但进行了微调,以便将分钟和秒显示为:03或:09,而不是像这样:3或:9: var min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes(); var sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds(); - user1985189
4
Bug: getMonth()方法返回0到11之间的月份数字,因此a.getMonth() - 1是错误的。请修正。 - jcampbell1
1
不需要月份名称列表,JavaScript 已经有了,即使在 IE 中也是如此。var month = a.toLocaleDateString(undefined, {month: 'short'}) - Curtis

290

JavaScript操作的单位是毫秒,因此您需要先将UNIX时间戳从秒转换为毫秒。

var date = new Date(UNIX_Timestamp * 1000);
// Manipulate JavaScript Date object here...

这简单多了,为什么其他答案都这么复杂呢? - undefined

226

使用:

var s = new Date(1504095567183).toLocaleDateString("en-US")
console.log(s)
// expected output "8/30/2017"  

而对于时间:

var s = new Date(1504095567183).toLocaleTimeString("en-US")
console.log(s)
// expected output "3:19:27 PM"

请参阅Date.prototype.toLocaleDateString()


这是一个获取日期(M/D/YYYY)而不是所请求的时间(HH/MM/SS)的命令。 - Wolfgang
23
注意:数字"1504095567183"是Unix时间戳乘以1000的结果。 - camillo777
16
另外,toLocaleString 包括日期和时间。 - Sean

133

现代解决方案(适用于2020年)

在这个新世界中,我们应该向标准的Intl JavaScript对象迈进,该对象具有一个方便的DateTimeFormat构造器和一个.format()方法:

function format_time(s) {
  const dtFormat = new Intl.DateTimeFormat('en-GB', {
    timeStyle: 'medium',
    timeZone: 'UTC'
  });
  
  return dtFormat.format(new Date(s * 1e3));
}

console.log( format_time(12345) );  // "03:25:45"


永恒解决方案

为了与所有传统的JavaScript引擎100%兼容,以下是将秒格式化为hh:mm:ss的最短单行解决方案:

function format_time(s) {
  return new Date(s * 1e3).toISOString().slice(-13, -5);
}

console.log( format_time(12345) );  // "03:25:45"

以下是翻译内容:

方法Date.prototype.toISOString()返回的时间格式是简化扩展版ISO 8601,长度始终为24或27个字符(即YYYY-MM-DDTHH:mm:ss.sssZ±YYYYYY-MM-DDTHH:mm:ss.sssZ)。时区总是零UTC偏移。

此解决方案不需要任何第三方库,并且在所有浏览器和JavaScript引擎中都受支持。


我将你的函数粘贴到Chrome的控制台中:/ 即使在你的fiddle中,对我来说也显示01:02:00!在Firefox上尝试过,结果相同。非常奇怪...我很确定这是因为我是GMT+1! - Steve Chamaillard
我为你的答案提供了一个编辑,忽略任何时区,因此它将始终显示正确的格式化值! - Steve Chamaillard
1
@SteveChamaillard 谢谢你,Steve。你是对的,toTimeString 在处理时区方面存在问题。不幸的是,在我看到它之前,你的编辑被拒绝了。然而,我建议使用 toISOString 代替,因为 toGMTString 已经过时,并且在不同平台上可能返回不同的结果。 - VisioN
使用ES6更简洁的写法:let time = s => new Date(s * 1e3).toISOString().slice(-13, -5) - SamGoody
在 Safari iOS 13 中使用 navigator.geolocation 的时间戳,两者都无法工作。 - lys

89

我更喜欢Jacob Wright的Date.format()库,它实现了JavaScript日期格式化,类似于PHP的date()函数。

new Date(unix_timestamp * 1000).format('h:i:s')

15
我知道以前这是个好的答案,但现在扩展原生 JavaScript 对象是一种反模式。 - Peter
5
在Node.js中,“format is not a function”无法工作(或不再工作)。但是,显然这个解决方案有效:https://dev59.com/8HA65IYBdhLWcg3w7Taa#34015511 - ibodi
@ibodi 这是一个库。 - Alex78191

40

将秒数格式化为hh:mm:ss的最短一行解决方案:

console.log(new Date(1549312452 * 1000).toISOString().slice(0, 19).replace('T', ' '));
// "2019-02-04 20:34:12"


1
当我在使用PHP Unix时间戳时,由于某种原因,我得到的时间比实际时间晚了5个小时 :/ - keanu_reeves
2
@keanu_reeves - 听起来你在东部美国时区,时间戳是UTC。尝试删除.slice(0,19),我认为你会看到结果的时区是Z(祖鲁时间)。 - bitfiddler

37

我建议使用像momentjs.com这样的库,它可以使此过程变得非常简单:

基于Unix时间戳:

var timestamp = moment.unix(1293683278);
console.log( timestamp.format("HH/mm/ss") );

根据一个 MySQL 的日期字符串:

var now = moment("2010-10-10 12:03:15");
console.log( now.format("HH/mm/ss") );

5
moment.js(或类似库)的另一个优点是它们支持“相对时间”(relative time),用于显示诸如“6小时前”之类的消息。 - martin
在你的 console.log 示例中,我因为 / 的格式而感到困惑,但这对我帮助很大。 - NetOperator Wibby
我的时间戳是以UTC格式表示的。这里需要做出任何更改吗?我如何使用am/pm? - codec
moment.js 对于这样一个小事情来说过于复杂,会影响你的性能。建议使用本地方法,参见 Dan Alboteanu 的回答 - Robin Métral

33

现在你需要使用Unix时间戳:

const dateTimeString = moment.unix(1466760005).format("DD-MM-YYYY HH:mm:ss");

29

这适用于PHP时间戳

var d = 1541415288860;
//var d =val.timestamp;

//NB: use + before variable name
var date = new Date(+d);

console.log(d);
console.log(date.toDateString());
console.log(date.getFullYear());
console.log(date.getMinutes());
console.log(date.getSeconds());
console.log(date.getHours());
console.log(date.toLocaleTimeString());

var d =val.timestamp;
var date=new Date(+d); //NB: use + before variable name

console.log(d);
console.log(date.toDateString());
console.log(date.getFullYear());
console.log(date.getMinutes());
console.log(date.getSeconds());
console.log(date.getHours());
console.log(date.toLocaleTimeString());

上述方法将生成此结果。

1541415288860
Mon Nov 05 2018 
2018 
54 
48 
13
1:54:48 PM

有很多方法可以完美地使用时间戳,无法列举所有。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接