Здесь вы говорите о нескольких разных вещах: вы работаете с Javascript в вашем шаблоне Bootstrap, ваших переменных ColdFusion и вашей базе данных.Все 3 могут повлиять на конечную дату, которую вы видите, и то, что вы видите, - это не объект даты (как, в конечном счете, должна хотеть база данных), а строковое представление объекта даты.
Когда вы смотрите на дату, она, вероятно, выглядит как March 27, 2019 12:00:00 pm
или 03/27/2019 12:00:00 pm
или 27/03/2019 12:00:00.000
или что-то в этом роде.Когда база данных или язык программирования воспринимают эту строку как объект даты, она выглядит как 123465789.123465798
, что обычно составляет конкретное значение в секундах с той эпохи, которую использует системный компонент.Epoch
- это совершенно другая тема.
Поскольку длинная десятичная дробь не очень удобна для восприятия как дата, ваш язык должен выполнять маскирование для преобразования междудва представления.
Вы хотите иметь в виду, какой фрагмент кода вы используете для маскировки.Обычно маскировка предназначена для отображения, но вам также может понадобиться преобразовать строку в объект с возможностью считывания даты в вашей базе данных, прежде чем он вставит ее.Итак, вы захотите убедиться, что ваш Javascript ничего не делает со значением в вашей форме, что ColdFusion ничего не делает с этой строкой Javascript, и что ваша база данных больше не изменяет эту строку ColdFusion.
Я не уверен, что Bootstrap datapicker
использует для интерпретации строк даты или, если он в конечном итоге отправляет нечетную строку в ColdFusion, но я знаю, что CF11 использует различную маскировку в зависимости от используемой вами функции,DateFormat()
не волнует, в каком случае вы используете, но DateTimeFormat()
делает.Он опирается на определение маскировки своей базовой Java SimpleDateFormat
, которая интерпретирует y
и Y
как разные маски, означающие разные вещи.
Большая боль в том, что, как вы видели, он будет виден только через несколько дней в конце года, поскольку год никогда не будет составлять ровно 52 недели.Таким образом, у нас есть другой тип даты, называемый WeekYear
или Y
в SimpleDateFormat
маскировании.По сути, это год, на котором она основана на Неделе (W
или w
).Таким образом, в течение нескольких дней в начале и конце года календарный год не будет равняться году недели.В остальные 358 дней года они будут такими же.А поскольку новогодние и новогодние праздники часто являются нерабочими праздниками, это ОЧЕНЬ ПРОСТО .Так что, по сути, ваш код не работал правильно последние пару лет;у тебя просто не было причин замечатьЗабавно, правда?
Для простого примера смотрите: https://trycf.com/gist/5cb651559e28e5cbdecdb57b959c3c18/acf11?theme=monokai
И если вы заметите, и dateFormat()
, и timeFormat()
будут маскироваться за пределы того, что они "технически" предполагаютсясделать.Вы можете получить timeFormat()
, чтобы применить маску и к date
части строки.Они не должны работать таким образом.
Как я уже говорил в нескольких местах, обработка дат (почти на любом языке) - моя любимая мозоль.Это тема, которая заставит вас захотеть вырвать свои волосы.И, возможно, волосы любого, кто сидит рядом с вами.И ОПРЕДЕЛЕННО волосы того, кто написал код обработки даты, который вы отлаживаете.Это полностью тема, вызывающая ярость кода.
В любом случае, если вы захотите взглянуть на некоторые другие примеры, я уже писал об этом пару раз и, вероятно, сделаю это снова.Спасибо, что втянул меня обратно в эту кроличью нору чистого безумия.
https://codefumonkey.blogspot.com/2016/02/date-masking-inconsistency.html https://codefumonkey.blogspot.com/2016/10/more-date-masking.html
ПРИМЕЧАНИЕ: Более поздние версии CF изменили поведение маскирования в некоторых функциях даты. Они не чувствительны к регистру в CF2018, поэтому не имеет значения, используете ли вы yyyy
или YYYY
. Но сделайте себе одолжение и используйте yyyy
, поскольку вы знаете, что CF по-прежнему построен на Java. Однако есть некоторые другие фреймворки, которые ожидают YYYY
вместо yyyy
, поэтому очень важно помнить, какой язык вы используете для применения маски. И если вам не нужно видеть значение даты и вы можете продолжать работать с объектом даты, оставьте его таким, а не делайте его читабельной строкой.