2016-09-14 274 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);