JavaScript将时间字符串转换为日期对象

22
请看以下代码;
var d = new Date();
var s = "01.00 AM";
d.setTime(s);

我知道这段代码是有问题的,请给我正确的设置时间的方法。我手头有一个字符串格式的12小时制时间。

时间会变化,无法预先知道具体时间。并且它是12小时制时间。因此可能是上午或下午。

5个回答

28
你可以使用正则表达式解析时间,并相应设置小时和分钟:

http://jsfiddle.net/54VkC/1/

var d = new Date(),
    s = "01.25 PM",
    parts = s.match(/(\d+)\.(\d+) (\w+)/),
    hours = /am/i.test(parts[3]) ? parseInt(parts[1], 10) : parseInt(parts[1], 10) + 12,
    minutes = parseInt(parts[2], 10);

d.setHours(hours);
d.setMinutes(minutes);

alert(d);

编辑 1: 正如jaisonDavis所指出的,原始代码在处理12.XX的AM或PM时会出现问题,这是一个疏忽,因为我自己从不使用12小时制,认为它从00.00开始,这是错误的。

可以在此处看到处理这些情况的更正代码:

http://jsfiddle.net/54VkC/93/

var test, parts, hours, minutes, date,
    d = (new Date()).getTime(),
    tests = ['01.25 PM', '11.35 PM', '12.45 PM', '01.25 AM', '11.35 AM', '12.45 AM'],
    i = tests.length,
    timeReg = /(\d+)\.(\d+) (\w+)/;

for(; i-- > 0;) {
    test = tests[i];
    
    parts = test.match(timeReg);
    
    hours = /am/i.test(parts[3]) ?
        function(am) {return am < 12 ? am : 0}(parseInt(parts[1], 10)) :
        function(pm) {return pm < 12 ? pm + 12 : 12}(parseInt(parts[1], 10));
    
    minutes = parseInt(parts[2], 10);
    
    date = new Date(d);
    
    date.setHours(hours);
    date.setMinutes(minutes);
    
    console.log(test + ' => ' + date);
}


如果时间在下午12:00和下午12:59之间,它仍会向时间添加12小时,这使时间变为上午12:**。 - jaisonDavis
@jaisonDavis 你说得对,谢谢你指出来,我自己并不常用12小时制。我已经对原回答进行了补充,以处理这些情况。在未来使用12小时制时,我一定会记住12.XX的存在 :-) - thebreiflabb
这真的帮了我很多,谢谢。 - Paulj
这正是我在寻找的...谢谢! - Brian Sanchez

15

我来晚了,但我想分享一个不使用正则表达式的函数:

function setDateTime(date, time) {
    var index = time.indexOf("."); // replace with ":" for differently displayed time.
    var index2 = time.indexOf(" ");

    var hours = time.substring(0, index);
    var minutes = time.substring(index + 1, index2);

    var mer = time.substring(index2 + 1, time.length);
    if (mer == "PM"){
        hours = hours + 12;
    }


    date.setHours(hours);
    date.setMinutes(minutes);
    date.setSeconds("00");

    return date;
}

5

使用moment.js将是简单的解决方案。

const fullDate = new Date();
// fullDate = Tue Dec 12 2017 11:18:30 GMT+0530 (IST) {}
const time = '01.00 AM';
const d = moment(fullDate).format('L'); // d = "12/12/2017"
const date = moment(d +' '+ time).format();
// date = "2017-12-12T01:00:00+05:30"

如果你想将moment日期转换为js日期
const jsDate = moment(date).toDate();

为什么它会是“最好的”? - Lee Goddard
我非常怀疑这是“最佳”解决方案,为了实现如此简单的功能而推荐用户引入一个庞大的第三方库应该非常谨慎。 - Malik Bagwala
1
我把我的话从“最好的”改成了“容易的”。 - loyoliteabid

1
function getCurrentDate() {
    var lDate = new Date();
    var lDay = lDate.getDate();
    var lMonth = lDate.getMonth() + 1;
    var lYear = lDate.getFullYear();

    if (lDay < 10) {
        lDay = '0' + lDay
    }

    if (lMonth < 10) {
        lMonth = '0' + lMonth
    }
    mCurrentDate = lYear + "-" + lMonth + "-" + lDay + "T00:00:00+05:30";
}

1
我对@thebreiflabb的答案进行了改进,以适应我的用例,并分享出来。
如果将正则表达式更改为timeReg = /(\d+)[\.|:](\d+)\s?(\w+)/;,它将处理其他几种常见情况。
即:
  • 使用冒号而不是小数点在小时和分钟之间
  • 允许am/pm紧接着时间而没有空格
此外,将秒设置为0(因为这是我的主要用例)。
最终代码如下:
var test, parts, hours, minutes, date,
    d = (new Date()).getTime(),
    tests = ['01.25 PM', '01:25pm', '1:25 PM', '11.35 PM', '12.45 PM', '01.25 AM', '11.35 AM', '12.45 AM'],
    i = tests.length,
    timeReg = /(\d+)[\.|:](\d+)\s?(\w+)/;

for(; i-- > 0;) {
    test = tests[i];

    parts = test.match(timeReg);

    hours = /am/i.test(parts[3]) ?
        function(am) {return am < 12 ? am : 0}(parseInt(parts[1], 10)) :
        function(pm) {return pm < 12 ? pm + 12 : 12}(parseInt(parts[1], 10));

    minutes = parseInt(parts[2], 10);

    date = new Date(d);

    date.setHours(hours);
    date.setMinutes(minutes);
    date.setSeconds(0);

    console.log(test + ' => ' + date);
}

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