2010-07-21 2 views
2

Я новичок в JavaScript (но не программировании), и мне сложно определить, где я совершил ошибку в этой функции, найденной здесь: http://mikeryan.webatu.com/function.html[мертвая ссылка] [Угадание исходного кода внизу]Преобразование числа DDMMYY в дату?

Функция должна иметь временную метку DDMMYY и преобразовывать ее в колонку для чтения человеком. Например, 210710 будет превращен в July 21st, 2010.

UPDATE: Код, который, вероятно, аналогичный OP мертва ссылка:

function timestamp(d){ 
    var year = (d-(Math.round(d/100)*100); 

    var day = Math.floor(d/10000); 
    var dayfix = (day - (Math.floor(day/10)*10)); 

    // var month = ((d-year)-(day*100000)/100); 

    var a = (d - year); 
    var b = ((day * 100000)/10); 

    var month = (a - b)/100; 

    var months = new Array(); 
    months[1] = "January"; 
    months[2] = "February"; 
    months[3] = "March"; 
    months[4] = "April"; 
    months[5] = "May"; 
    months[6] = "June"; 
    months[7] = "July"; 
    months[8] = "August"; 
    months[9] = "September"; 
    months[10] = "October"; 
    months[11] = "November"; 
    months[12] = "December"; 

    var daysuffix = new Array(); 
    daysuffix[0] = "th"; 
    daysuffix[1] = "st"; 
    daysuffix[2] = "nd"; 
    daysuffix[3] = "rd"; 
    daysuffix[4] = "th"; 
    daysuffix[5] = "th"; 
    daysuffix[6] = "th"; 
    daysuffix[7] = "th"; 
    daysuffix[8] = "th"; 
    daysuffix[9] = "th"; 

    if(year>20){ 
     year = '19' + year; 
    } 
    else{ 
     year = '20' + year; 
    } 
    return (months[month] + ' ' + day + daysuffix[dayfix] + ', ' + year); 
} 
+0

почему бы не превратить 210710 в строку, а затем сделать parseNumber на подстроки, чтобы получить свои значения ? Может быть менее эффективным, но, кажется, легче думать. –

+0

Вы посмотрели [Дата объекта] JS [http://www.w3schools.com/jsref/jsref_obj_date.asp)? – NullUserException

+0

Вы приняли ответ, но я предоставил один объект Date, который он проверит, а также проверит ссылку NullUserException. Использование объекта даты может быть проще, чем попытка самостоятельно проанализировать данные. – qw3n

ответ

5

Одна проблема: вам не хватает скобку. Изменение:

var year = (d-(Math.round(d/100)*100); 

в

var year = (d-(Math.round(d/100)*100)); 

Это, как говорится, это более простой метод расчета:

var year = d % 100; 
var month = Math.floor(d/100) % 100; 
var day = Math.floor(d/10000) % 100; 

Далее ваша инициализация массива является излишне многословным. Вместо того, чтобы:

var arr = new Array(); 
arr[0] = "foo"; 
arr[1] = "bar"; 

просто сделать:

var arr = ["foo", "bar"]; 

Ваш день суффикс неверен. Он ставит «nd» после 12 и «12 апреля» явно неверно. Я бы просто использовал логику для этого, а не для поиска, где большинство элементов - «th».

Итак:

function timestamp(d){ 
    var year = d % 100; 
    var month = Math.floor(d/100) % 100; 
    var day = Math.floor(d/10000) % 100; 
    var months = ["January", "February", "March", "April", "May", "June", 
    "July", "August", "September", "October", "November", "December"]; 
    if (year>20) { 
    year = '19' + year; 
    } else { 
    year = '20' + year; 
    } 
    if (day == 1 || day == 21 || day == 31) { 
    var suffix = "st"; 
    } else if (day == 2 || day == 22) { 
    var suffix = "nd"; 
    } else { 
    var suffix = "th"; 
    } 
    return (months[month-1] + ' ' + day + suffix + ', ' + year); 
} 

Наконец есть небольшое значение в вашей «метки времени» в целое число в его нынешнем виде. Более типичный формат для ТИС рода вещи ГГГГММДД по двум причинам:

  1. Численный заказ соответствует дате упорядоченность; и

  2. Это однозначно. Североамериканцы помещают месяц за днем ​​(т.е. MMDDYY). Все остальные в мире ставят первый день (т. Е. DDMMYY). Никто не делает YYDDMM.

+0

Да, я устал и полностью пропустил этот. Большое спасибо! –

+0

Спасибо, cletus! Ваш отредактированный ответ был очень полезен, и для меня был большой опыт обучения. –

+0

Единственная причина, по которой я решил пойти с целым числом в первую очередь, - это выполнить сравнение времени в более поздней функции, чтобы определить время между двумя датами. Что касается второго момента, я понял эту ошибку раньше и изменил ее на сервере. Еще раз, спасибо за помощь! –

0

Я хотел бы использовать % - по модулю: X по модулю 100 отбрасывает ничего, кроме последних 2-х цифр. Полезно!

также использовать floor не round

+0

Хорошо, спасибо за подсказку. Сделают изменения. –

0

Используйте объект даты. Это намного быстрее. Вот краткий пример, который предполагает, что год будет в 2000-х годах, поэтому вам придется внести некоторые изменения. И результат не совсем то, что у вас есть, но он довольно близок, а код намного короче.

function date(e){ 
    var d = new Date(); 
    d.setYear(2000+e.substring(4)/1,e.substring(2,4)-1,e.substring(0,2)-1); 
    alert(d.toDateString()); 
} 
0

Первое использование Math.floor для получения значения пола десятичной дроби, тогда в вашей функции были некоторые опечатки. Вот код, который работает (Примечание: только что протестировал с парой примеров), но должно быть достаточно, чтобы получить ваши начал:

  function timestamp(d){ 
     var year = (d-(Math.floor(d/100)*100)); 

     var day = Math.floor(d/10000); 
     var dayfix = (day - (Math.floor(day/10)*10)); 

     // var month = ((d-year)-(day*100000)/100); 

     var a = (d - year); 
     var b = ((day * 100000)/10); 

     var month = (a - b)/100; 

     var months = new Array(); 
     months[1] = "January"; 
     months[2] = "February"; 
     months[3] = "March"; 
     months[4] = "April"; 
     months[5] = "May"; 
     months[6] = "June"; 
     months[7] = "July"; 
     months[8] = "August"; 
     months[9] = "September"; 
     months[10] = "October"; 
     months[11] = "November"; 
     months[12] = "December"; 

     var daysuffix = new Array(); 
     daysuffix[0] = "th"; 
     daysuffix[1] = "st"; 
     daysuffix[2] = "nd"; 
     daysuffix[3] = "rd"; 
     daysuffix[4] = "th"; 
     daysuffix[5] = "th"; 
     daysuffix[6] = "th"; 
     daysuffix[7] = "th"; 
     daysuffix[8] = "th"; 
     daysuffix[9] = "th"; 

     if(year>20){ 
      year = '19' + year; 
     } 
     else{ 
      year = '20' + year; 
     } 
     return (months[month] + ' ' + day + daysuffix[dayfix] + ', ' + year); 
    } 
Смежные вопросы