2013-05-05 14 views
9

Zobacz poniższy kod;JavaScript ustaw czas ciąg do obiektu daty

var d = new Date(); 
var s = "01.00 AM"; 
d.setTime(s); 

Wiem, że ten kod jest nieprawidłowy. Podaj mi prawidłowy sposób ustawienia czasu. Mam w ręku 12 godzinny format struny.

Czas będzie różny. Nie wiem, jaki będzie czas wcześniej. Również trwa 12 godzin. Tak będzie AM lub PM

Odpowiedz

16

Można analizować razem z regex i ustawić godziny i minuty odpowiednio:

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); 

Edycja 1: jako jaisonDavis zauważył, oryginalny kod nie będzie działał dla AM lub PM dla 12.XX, co było niedopatrzeniem, ponieważ nigdy nie używam formatu 12-godzinnego, myśląc, że zaczęło się o 00.00, co było błędem.

Skorygowana kod, który obsługuje te przypadki, można zobaczyć tutaj:

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); 
 
}

+0

Jeśli czas jest między 12.00 i 12,59 PM wciąż dodaje 12 godzin do czasu, co sprawia, że ​​czas 12. ** AM – jaisonDavis

+0

@jaisonDavis Masz rację, dziękuję, że go złapałeś, sam nie używam formatu 12-godzinnego.Uzupełniłem oryginalną odpowiedź, która zajmuje się tymi przypadkami. I na pewno zapamiętam 12.XX, kiedy będę pracował z 12-godzinnym formatem w przyszłości :-) – thebreiflabb

+0

To naprawdę mi pomogło, ty – Paulj

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"; 
} 
7

jestem późno do partii, ale myślałem, że podzielić się funtion, który nie używa wyrażeń regularnych:

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; 
} 
0

Dodałem kilka rzeczy jako poprawkę do zaakceptowanej odpowiedzi @thebreiflabb, aby dopasować ją do mojego przypadku użycia i pomyślałem, że bym się nią podzielił.

jeśli wyrażenie regularne zostanie zmienione na timeReg = /(\d+)[\.|:](\d+)\s?(\w+)/;, , zajmie się kilkoma innymi typowymi przypadkami.

mianowicie:

  • stosując okrężnicy zamiast miejsca dziesiętnego pomiędzy godzin i minut
  • pozwalających AM/PM, aby bezpośrednio po raz bez odstępu

również ustawienie sekund 0 (ponieważ był to mój główny przypadek użycia)

kod wynikowy będzie:

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); 
} 
0

Korzystanie z moment.js będzie najlepszym rozwiązaniem.

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" 

Jeśli chcesz przekonwertować datę moment na bieżąco js

const jsDate = moment(date).toDate();