2016-09-14 280 views
0

我有一个简单的验证,应该防止时间输入/输出不正确的值。因此,如果用户挑选例如:新日期()12/24小时格式JavaScript?

12:30 PM = Time In12:15 PM = Time Out

他们将得到屏幕'Time Out can not be less or equal than Time In'上的消息。

我的验证工作正常,但在一个案例。例如用户随到随:

Time In: 12:30 PMTime Out: 1:00 PM

他们点击保存和警报消息弹出。我发现我的代码是这样产生的:

Time In: Thu Sep 15 2016 00:29:00 GMT-0500 (Central Standard Time)Time Out: Wed Sep 14 2016 13:29:00 GMT-0500 (Central Standard Time) 

我使用JavaScript为Time In Time和Time out值创建新日期。看起来我的代码在new Date()中设置00为12 PM小时。所以我的问题是如何防止这个问题,或者有任何其他方式在JavaScript中解决这个问题。这里是我的代码,在那里我在转换到新的Date()接受两个输入值:

var timeIn = document.getElementById('timeIn').value; 
var timeOut = document.getElementById('timeOut').value; 
var today = new Date(), 
    curYear = today.getFullYear(), 
    curDate = today.getDate(), 
    curMonth = today.getMonth(), 

    defaultTimeIn = timeIn.split(":"), 
    defaultTimeOut = timeOut.split(":"), 

    defaultHourIn = parseInt(defaultTimeIn[0], 10), 
    defaultHourOut = parseInt(defaultTimeOut[0], 10), 

    defaultMinAMPMIn = defaultTimeIn[1].split(" "), 
    defaultMinAMPMOut = defaultTimeOut[1].split(" "), 

    defaultMinIn = defaultMinAMPMIn[0], 
    defaultMinOut = defaultMinAMPMOut[0], 

    defaultAMPMIn = defaultMinAMPMIn[1], 
    defaultAMPMOut = defaultMinAMPMOut[1]; 

if (defaultAMPMIn == "PM") { 
    defaultHourIn += 12; //hours are in 24-hour format (0-23) 
} 

if (defaultAMPMOut == "PM") { 
    defaultHourOut += 12; //hours are in 24-hour format (0-23) 
} 

var compTimeIn = new Date(curYear, curMonth, curDate, defaultHourIn, defaultMinIn); 
var compTimeOut = new Date(curYear, curMonth, curDate, defaultHourOut, defaultMinOut); 

if (compTimeIn >= compTimeOut) { 
    alert("'Time Out' can't be less or equal to 'Time In'"); 
} 
+0

将与不同的区域设置这项工作是否正常? – ppeterka

+0

@ppeterka我不确定。 –

+3

你可以看看http://momentjs.com/。这可能是一个最好的库,用于处理javascript中的日期/时间。你会为它节省很多麻烦。 – Paulooze

回答

1

只要改变你的病情从:

defaultAMPMOut/In == "PM"

defaultAMPMOut/In == "PM" && defaultHourOut/In != 11 //or 12 depending on if it starts at 0 or 1

发生了什么是如果它是12,那么它不应该加12,将它滚动到0.

编辑:

如果是中午12点,你还必须要减去12小时,它的0

if (defaultAMPMIn == "PM" && defaultHourIn != 12) { 
    defaultHourIn += 12; //hours are in 24-hour format (0-23) 
} 

if (defaultAMPMOut == "PM" && defaultHourOut != 12) { 
    defaultHourOut += 12; //hours are in 24-hour format (0-23) 
} 

if (defaultAMPMOut == "AM" && defaultHourOut == 12) { 
    defaultHourOut -= 12; //hours are in 24-hour format (0-23) 
} 

if (defaultAMPMIn == "AM" && defaultHourIn == 12) { 
    defaultHourIn -= 12; //hours are in 24-hour format (0-23) 
} 
+0

我测试了上面的代码并为我工作。我不确定这是否会阻止与时间冲突的其他错误。看起来像24小时不会被击中。如果我选择12AM,它将显示12小时。 –

+0

你应该有一个检查,如果它说AM和12,使它0或1 –

+0

因此,在我的if(默认AMPMOut/In ==“PM”&& defaultHourOut/In!= 12)我应该检查上午12点,并减去在这种情况下? –

-1

试试这个。

// Your Code 
    if (defaultAMPMIn == "PM" && defaultHourIn >12) { 
       defaultHourIn += 12;//hours are in 24-hour format (0-23) 
      } 

      if (defaultAMPMOut == "PM" && defaultHourOut >12) { 
       defaultHourOut += 12;//hours are in 24-hour format (0-23) 
      } 
    //Your Code 
+0

我试过这个,并没有为我工作。 –

1

为什么不这样做简单的东西,并转换成可重复使用的功能,这一点,是这样的:

var time = document.getElementById('timeIn').value; 
var hours = Number(time.match(/^(\d+)/)[1]); 
var minutes = Number(time.match(/:(\d+)/)[1]); 
var AMPM = time.match(/\s(.*)$/)[1]; 
if(AMPM == "PM" && hours<12) hours = hours+12; 
if(AMPM == "AM" && hours==12) hours = hours-12; 
var sHours = hours.toString(); 
var sMinutes = minutes.toString(); 
if(hours<10) sHours = "0" + sHours; 
if(minutes<10) sMinutes = "0" + sMinutes; 
alert(sHours + ":" + sMinutes); 
+1

这是一个例子,是为了引导,而不是为你做的代码:) – zerohero

2

12小时制24小时制,小时+周期转换。

function to24Hour(hour, period) { 
 
    if (period === 'AM' && hour === 12) { 
 
    hour -= 12; 
 
    } else if (period === 'PM' && hour < 12) { 
 
    hour += 12; 
 
    } 
 
    return hour; 
 
} 
 
const hours12 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; 
 
const hours24 = []; 
 
for (let hour of hours12) { 
 
    hours24.push(to24Hour(hour, 'AM')); 
 
    hours24.push(to24Hour(hour, 'PM')); 
 
} 
 
console.log(hours24);