我在比较javascript中的日期时遇到了一些问题。
我的日期为“2014年12月1日”& “2014年11月19日”格式。
我比较日期,如
var stDate='19-Nov-2014';
var endDate='1-Dec-2014';
if(stDate < endDate){
console.log('Hi');
}else{
console.log('Bye');
}
在外面它显示我“再见”,但它应该是“嗨”。
我观察到这种比较比较了各个日期的日期(初始参数)。
我是javascript的新手。我没有办法解决这个问题。
请帮帮我。
答案 0 :(得分:1)
目前您只比较两个字符串。您应该比较这样的日期:
new Date(stDate) < new Date(endDate)
var stDate='19-Nov-2014';
var endDate='1-Dec-2014';
if(new Date(stDate) < new Date(endDate)){
console.log('Hi');
}else{
console.log('Bye');
}
答案 1 :(得分:0)
就像@Arun P Johnny所说,你正在比较Strings而不是实际日期。在比较它们之前,您需要将日期转换为Date对象。检查this。
答案 2 :(得分:0)
function ValidateDate() {
var SDate = document.getElementById('<%=sdate.ClientID%>').value;
var EDate = document.getElementById('<%=edate.ClientID%>').value;
var sdate = new Date(stDate);
var Edate = new Date(endDate);
var alertReason1 = 'To Date must be greater than or equal to From Date.'
//var endDate = new Date(EDate);
//var startDate = new Date(SDate);
if (SDate != "" && EDate != "" && Edate > sdate ) {
alert(alertReason1);
return false;
}
}
答案 3 :(得分:0)
如其他答案所述,您需要将字符串转换为Date对象。最好的方法是使用如下函数解析字符串:
/* Return a Date object or NaN given a string in d, MMM y or dd-MMM-yyyy format
** e.g. 5 Dec, 2014
** Avoid conversion of two digit dates to 20th century
** Returns NaN if string is not a valid date
*/
function parseDMMMY(s) {
var b = s.match(/\w+/g);
var months = {jan:0, feb:1, mar:2, apr:3, may:4, jun:5,
jul:6, aug:7, sep:8, oct:9, nov:10, dec:11};
if (b) {
var d = new Date();
d.setHours(0,0,0,0);
d.setFullYear(b[2], months[b[1].toLowerCase()], b[0]);
}
return b && d.getFullYear() == b[2] && d.getDate() == b[0]? d : NaN;
}
如果将值直接传递给Date构造函数而不是使用 set * 方法,这也会像第19年那样处理1-1-19之类的日期,而不是1919年。
现在你可以做到:
var stDate = parseDMMMY('19-Nov-2014');
var endDate = parseDMMMY('1-Dec-2014');
答案 4 :(得分:0)
要正确处理日期,我会引用Pavel Hodek
您可以做的最好的事情是使用ISO格式:YYYY-MM-DD或YYYY-MM-DDTHH:MM:SS
例如: 新日期('2011-04-11')
或
新日期('2011-04-11T11:51:00')
更多信息:MDN | Date
编辑:
对于旧的Internet Explorer兼容性(小于9的IE版本在Date构造函数中不支持ISO格式),您应该将日期时间字符串表示形式拆分为它的部分,然后您可以使用构造函数使用日期时间部分,例如:new Date('2011 ','04' - 1,'11','11','51','00')
请注意,月份数必须少1个。
重要提示:
“ISO格式”解决方案无法100%工作。字符串有时被解析为UTC,有时也被解析为本地时间(基于浏览器供应商和版本)。调用toString会返回当地时间,因此在某些情况下,根据用户的时区,新的日期('2011-04-11')将为您提供2011-04-10。
Chrome的行为与Internet Explorer 9相同,Firefox的行为与Internet Explorer 10 +相同。
安全解决方案是使用 Z 传递字符串值以将其解析为UTC值,例如新日期('2011-04-11T10:20:30Z')。最佳做法应始终是将日期存储为UTC并进行UTC计算。仅用于演示,它们应以当地时间形式呈现。
一旦你有两个日期(在解析和/或使用构造函数之后),你可以安全地比较它们。