Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中解析到日期的字符串_Javascript_Date_Datetime - Fatal编程技术网

在javascript中解析到日期的字符串

在javascript中解析到日期的字符串,javascript,date,datetime,Javascript,Date,Datetime,我正在创建一个函数来比较自定义日期时间和当前日期时间。 在比较之前,我将字符串dd/MM/yyyy HH:MM:ss转换为new Date() 代码如下: var getCurrentDateTime=函数(){ var dt=新日期(), dd=dt.getDate(), MM=dt.getMonth()+1, yyyy=dt.getFullYear(), HH=dt.getHours(), mm=dt.getMinutes(), ss=dt.getSeconds(); 返回新日期(yyyy

我正在创建一个函数来比较自定义日期时间和当前日期时间。 在比较之前,我将字符串
dd/MM/yyyy HH:MM:ss
转换为
new Date()

代码如下:

var getCurrentDateTime=函数(){
var dt=新日期(),
dd=dt.getDate(),
MM=dt.getMonth()+1,
yyyy=dt.getFullYear(),
HH=dt.getHours(),
mm=dt.getMinutes(),
ss=dt.getSeconds();
返回新日期(yyyy、MM、dd、HH、MM、ss)
};
var parseTimeString=函数(d){
//`d`formatting:'dd/MM/yyyy HH:MM:ss'
var d_d=d.split(“”)[0],
d_t=d.分割(“”)[1],
//x=新日期(2016年1月14日21日40日00分),
x=新日期(+d盘分割('/')[2],+d盘分割('/')[1]-1,
+d_d.split('/')[0],+d_t.split(':')[0],
+d_t.split(':')[1],+d_t.split(':')[2]),
c=getCurrentDateTime(),
z=Math.abs((c.getTime()-x.getTime())/1000);
如果(z 29&&z<60){
返回“30秒前”
}
如果(z>=60&&z<120){
返回“1分钟前”
}
如果(z>=120&&z<3600){
返回(c.getMinutes()-x.getMinutes())+“分钟前”
}
如果(z>=3600&&z<7200){
返回“1小时前”
}
如果(z>=7200&&z<86400){
返回(c.getHours()-x.getHours())+“小时前”
}
如果(z>=86400&&z<172800){
var m=x.getMinutes();
返回“昨天”+x.getHours()+”:“+(m<10?'0'+m:m)
}
如果(z>=172800){
var dd=x.getDate(),
MM=x.getMonth()+1,
yyyy=x.getFullYear(),
m=x.getMinutes();
dd=dd<10?'0'+dd:dd;
毫米=毫米<10英寸0英寸+毫米:毫米;
在“+x.getHours()+”:“+”处返回dd+'/'+MM+'/'+yyyy+”(m<10?'0'+m:m)
}
};
$(“按钮”)。单击(函数(){
setInterval(函数(){
var x=parseTimeString('14/01/2016 21:40:00');
$('body').html($('').text(x))
}, 1000)
})


单击我,您的
getCurrentDateTime
函数已中断。我不知道你为什么把它复杂化了这么多——它只是日期的替代品,不是吗

var getCurrentDateTime=函数(){
返回新日期();
};
var parseTimeString=函数(d){
var dateRegex=/^([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{4})\s+([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})$/;
var matches=dateRegex.exec(d);
console.log(匹配项);
如果(!matches | | matches.length=60&&difference<120){
返回“1分钟前”
}
如果(差值>=120&&差值<3600){
返回(currentDate.getMinutes()-x.getMinutes())+“分钟前”
}
如果(差值>=3600&&差值<7200){
返回“1小时前”
}
如果(差值>=7200&&差值<86400){
返回(currentDate.getHours()-givenDate.getHours())+“小时前”
}
如果(差值>=86400&&差值<172800){
var m=givenDate.getMinutes();
返回'beday'+givenDate.getHours()+':'+(m<10?'0'+m:m)
}
如果(差异>=172800){
var dd=givenDate.getDate(),
MM=givenDate.getMonth()+1,
yyyy=givenDate.getFullYear(),
m=givenDate.getMinutes();
dd=dd<10?'0'+dd:dd;
毫米=毫米<10英寸0英寸+毫米:毫米;
在“+givenDate.getHours()+”:“+”处返回dd+'/'+MM+'/'+yyyy+”(m<10?'0'+m:m)
}
};
$(“按钮”)。单击(函数(){
var starttime=新日期();
var asString=“14/01/2016”+starttime.getHours()+”:“+starttime.getMinutes()+”:“+starttime.getSeconds()”;
设置间隔(显示日期,1000,关联);
函数显示日期(startDate){
var x=parseTimeString(startDate);
$('body').html($('').text(x))
}
showDate(asString);
})


首先单击我,正如我在评论中指出的,您的
getCurrentDateTime()
函数过于复杂,并且在月份字段中有一个“off by one”错误,这可能是您实际问题的原因:

function getCurrentDateTime() {
    return new Date();
}
这个函数现在可以说是微不足道,不值得拥有

其次,您应该将日期的解析从随后的位中分离出来,从而将其转换为人类可读的内容:

function parseDateTime(s) {
    var date_time = s.split(' ');
    var date = date_time[0];
    var time = date_time[1];
    var dmy = date.split('/').map(Number);
    var hms = time.split(':').map(Number);

    return new Date(dmy[2], dmy[1] - 1, dmy[0], hms[0], hms[1], hms[2]);
}
或者,如果您喜欢ES6代码高尔夫:

let parseTime=(s)=>new(Function.prototype.bind.apply(Date,
         s.match(/^(\d\d?)\/(\d\d?)\/(\d{1,4})\s+(\d\d?):(\d\d?):(\d\d?)$/)
          .map((_,i,a)=>a[i<4?4-i:i]-+(i===2))))
let parseTime=(s)=>new(Function.prototype.bind.apply)(日期,
s、 匹配(/^(\d\d?\/(\d\d?)\/(\d{1,4})\s+(\d\d?)(\d\d?):(\d\d?)$/)
.map(((i,i,a)=>a[i=0&&z<30){
//等
}
}

您的代码存在一些问题。如其他答案中所述,getCurrentDate函数不值得使用,您不妨执行以下操作:

new Date();
解析日期时,您需要验证的不仅仅是模式,还需要验证值(例如,25:06:63的时间无效)。您可以将解析和验证捆绑在一个函数中,以便在值无效时,返回一个日期对象,并将NaN作为时间值(ECMA-262就是这么说的)

此外,在执行“时间之前”部分时,您不需要比较的
=
部分,因为每个if块都返回(如case块)。将它们放在一起:

/*至今以d/m/y h:m:s格式解析字符串
**如果日期字符串是无效的日期,则返回带有时间值的日期
**NaN(根据ECMA-262)
**
**@param{string}s-格式为dd/mm/yyyy hh:mm:ss的日期字符串
**@returns{Date}
*/
函数解析DMYHMS(个){
var b=s.split(/\D/);
var d=新日期(b[2],--b[1],b[0],b[3],b[4],b[5]);
//根据创建的日期验证日期字符串组件
返回d&d.getMonth()==b[1]&&d.getHours()==b[3]&&d.getMinutes()==b[4]?d:新日期(NaN);
}
/*返回d是多久以前的
**
**@param{Date}d
**@返回{string},如果输入无效,则返回未定义
*/
函数时间(d){
如果(!d | |!d.getTime())返回;//处理错误的输入,则假定为其他日期
功能板(n){return('0'+n).slice(-2)}
var z=(new Date()-d)/1e3;//以秒为单位的时差
如果(z<30)返回'Just now';
如果(z<60)返回“30秒前”;
如果(z<120)返回“1分钟前”;
if(z)
new Date();