2013-05-03 3 views
0

У меня есть эти два curdate и sdate var ... sdate - это стандартная строка, в которую входит кто-то, а затем она сравнивается с curdate. curdate - это поле даты из шаблона smarty (чтобы показать сегодняшнюю дату в формате mm/dd/yyyy)Преобразование строки Javascript на сегодняшний день

Мне нужно преобразовать sdate в формат того же типа, прежде чем сравнивать его с curdate, чтобы кто-то не вводил что-то вроде jan /12/2013 ... не совпадают и покажут это сообщение.

if(sdate > curdate){ 
    var d= confirm("The date you selected: " + sdate + " is in the future, OK to continue?"); 
    if(!d) return false; 
} 
+0

не решает проблему, которую я испытываю. – Lynx

+0

В каком формате 'curdate'? Это временная метка, не так ли? – Bergi

ответ

1

Вы можете «ограничить», что входной клиент будет использовать JavaScript, чтобы убедиться, что данные, которые введены в цифровой, например. С помощью этого числового ввода вы можете легко создать строку в нужном формате.
Я установил this fiddle, с, в основном, тот же код, что и ниже. скрипка также выполняет некоторые базовые проверки (например, не принимает даты по п. 33/54/1001) и анализирует дату. Как только будет введена полная дата, нажмите кнопку и проверьте вывод в консоли: это обычный объект даты, который можно сравнить с другим объектом даты (например, сегодня: curdate = new Date();).
Но для того, чтобы начать работу, вот упрощенная версия обработчика нажатия клавиши, что касается ввода данных пользователя:

var keypress = function(e) 
{ 
    e = e || window.event;//FROM HERE 
    var el = e.target || e.srcElement, 
    char = String.fromCharCode(e.keyCode || e.which); 
    e.returnValue = false; 
    e.cancelBubble = true; 
    if (e.preventDefault) 
    { 
     e.preventDefault(); 
     e.stopPropagation(); 
    }//TO HERE, a lot of X-browser issues are adressed 
    if (char == +(char) && el.value.length < 10) 
    {//format input: 
     el.value = (el.value + char).replace(/^([0-9]{0,2})\/*([0-9]{0,2})\/*([0-9]{0,4})$/,function(all, m, d, y) 
     { 
      m += m.length === 2 ? '/' : ''; 
      d += d.length === 2 ? '/' : ''; 
      return m+d+y; 
     }); 
    } 
    return e;//done 
}; 
var dateIn = document.getElementById('dateInputElement'); 
if (dateIn.addEventListener) 
{//add event handlers 
    dateIn.addEventListener('keypress',keypress, false); 
} 
else 
{ 
    return dateIn.attachEvent('onkeypress',keypress); 
} 

Чтобы получить лучшее понимание этого кода, вы можете захотеть взглянуть here и here.

+0

Как, черт возьми, я должен набирать что-либо в этом вводе, если не будет заблокировано каждое нажатие клавиши? Никогда не ограничивайте типизацию, но проверяйте перед отправкой (и, возможно, живую, но ненавязчивую) – Bergi

+0

@Bergi: Это не самый удобный подход, но вы _can_ введите в это поле ввода, во что бы то ни стало. Хотя каждый нечисловой символ будет проигнорирован. –

+0

Ух, но вам нужно начинать с '0' или' 1' за то, что вы не получаете предупреждения в своем лице :-) По крайней мере, это плохая практика, чтобы настроить вход, который не является входом, но обнаруживает нажатия клавиш и добавляет их вручную к его значению. Вы ничего не можете исправить, и это не соответствует событиям мыши (копировать, вставлять, перемещать выделение). Я бы назвал это user- * недружественным * ... – Bergi

1

Вы можете использовать библиотеку, например Date.js, для анализа введенных пользователем строк и других значений, подобных дате, в известный формат. Затем сравните напрямую.

if (Date.parse(sdate) > Date.parse(curdate)) { 
    ... 
} 
+1

Пока команда Date.js не сможет [получить] (https://groups.google.com/d/msg/datejs/U7W2DtwzMA8/jAx6IvwQZ2oJ) [их] (https://groups.google.com/d/msg/datejs/vTRd7yDX5Lg/lt5ajP9l3VgJ) [act] (https://code.google.com/p/datejs/issues) [вместе] (https://code.google.com/p/datejs/source/list) и создать стабильный выпуск, я бы не рекомендовал его использовать. Попробуйте вместо [moment.js] (http://momentjs.com/). –

+0

@Matt Прохладный! Я не слышал о мгновениях. OP, я бы также рекомендовал пойти с этим, поскольку он, кажется, находится в активной разработке, и Date.js не видел активности с 2007 года? – Dihedral

+0

В 2008 году у Date.js была некоторая активность кода, а некоторые обновления для doc в 2009 и 2010 годах, но имеет 125 открытых выпусков и все еще находится в выпуске «Alpha-1» с 2007 года. –

1

Использование moment.js, вы можете сделать что-то вроде:

if (moment(sdate, 'MM/DD/YYYY') > moment(curdate)) 
... 

Если вы говорите, что curdate представляет интересы "сейчас", а затем просто сделать:

if (moment(sdate, 'MM/DD/YYYY') > moment()) 
... 

Если вы хотите убедитесь, что дата находится в определенном формате, вы можете использовать их функции validation:

if (moment(sdate, 'MM/DD/YYYY').isValid()) 
... 
+0

Извините, я слишком быстро комментировал и не замечал '. isValid' бит (ну, я проигнорировал его). Это касается проблемы OP с форматированием ... комментарий ушел сейчас: P –

Смежные вопросы