Привет, Deep Code предлагает статический анализ программ на основе искусственного интеллекта для Java, Javascript, Typescript и Python. Возможно, вы знаете, что Deep Code использует тысячи репозиториев с открытым исходным кодом для обучения нашего движка. Мы попросили команду разработчиков предоставить некоторые статистические данные о результатах. Что касается лучших предложений нашего движка, мы хотим представить и дать некоторую информацию в этой серии статей в блоге. И это вызвало у меня головокружение, поскольку мы оглядываемся назад примерно на 70 лет разработки программного обеспечения и все еще испытываем проблемы с форматами даты барабанной дроби…
Язык: Java Дефект: Формат данных даты (категория Общая 1) Диагностика: Неоднозначные форматы вывода даты и времени (например, вывод 12 часов без суффикса am/pm)
Фон:
Быстро, в чем разница между строками формата даты ММ-ДД-ГГГГ
и мм-дд-гггг
или ММ-дд-гггг
?? Я могу вам сказать, что все они будут иметь одинаковый результат, когда вы позвоните им в нужный момент. Но очевидно, что они принципиально разные. Что ж, давайте прольем немного света…
У Java было плохое начало в отношении своих классов date. java.util. Date
имел серьезные недостатки в дизайне, когда он был введен, что привело к большой путанице. A Экземпляр Date
в Java на самом деле является не датой, а моментом времени, поэтому (1) у него нет часового пояса, (2) нет формата, (3) нет календарной системы. Я предлагаю этот ценный пост в блоге для полной истории. Спустя годы сообщество Java начало действовать и представило новые классы. Тем не менее, существует множество ловушек (например, java.text. SimpleDateFormat
не является потокобезопасным в то время как java.time.format. DateTimeFormatter
является) но сейчас давайте сосредоточимся на наиболее распространенной ошибке, которая отмечена DeepCode:
- Использование
мм
в течение месяцев и/илиММ
в течение минут (неправильно!). - Использование
hh
для “часа дня”, когда на самом деле предполагалосьHH
.HH
колеблется от 0 до 23, в то время какh
колеблется от 1 до 12 и в основном используется как одиночный символ. Ему нужна информация AM/PM, иначе она неоднозначна. - Используя
ГГГГ
для года. Он предназначен для использования в сочетании с “неделей года” и может привести к неожиданным результатам в первую и последнюю неделю года. Обычно вы хотите использоватьгггг
. - Используя
DD
для “дня месяца”, но на самом деле это означает “день года”, убедитесь, что используете правильные символы шаблона. В качестве ссылки на Java применяется следующее.
реклама | G | Обозначитель эпохи |
2020(гггг),20(гг) | y | Год |
2020(ГГГГ), 20(ГГ) | Y | Неделя-год (год недели, может дать неожиданные результаты в первую и последнюю неделю года) |
Июль(ММММ), июль(МММ), 07(ММ) | M | Месяц в году |
16 | w | Результаты за неделю в году |
3 | W | Результаты за неделю за месяц |
266 | D | Дает количество дней в году |
09(dd), 9(d) | d | День месяца |
4 | F | День недели в месяце |
Вторник, Вт | E | Название дня недели |
2 | u | Номер дня недели, где 1 представляет понедельник, 2 представляет вторник и так далее на |
АМ | a | Маркер AM или PM |
12 | H | Час в сутках (0-23) |
23 | k | Час в день (1-24) |
0 | K | Час в am / pm для 12-часового формата (0-11) |
12 | h | Час в am / pm для 12-часового формата (1-12) |
59 | m | Минута в часе |
35 | s | Секунда в минуту |
978 | S | Миллисекунда в минуте |
Тихоокеанское стандартное время; PST; GMT-08:00 | z | Часовой пояс |
-0800 | Z | Смещение часового пояса в часах (шаблон RFC) |
-08; -0800; -08:00 | X | Смещение часового пояса в формате ISO |
Примечание: Это Java. Не просто ожидайте, что это будет то же самое в других местах. Всегда проверяйте документацию.
Это не исчерпывающий перечень проблем, связанных с датами и временем. Мы могли бы поговорить о разнице между смещением UTC и часовыми поясами, о проблемах, связанных с сокращениями часовых поясов (является ли британское летнее время BST или Британское стандартное время или, скорее, Стандартное время Бугенвиля (Нет, я это не выдумал)? Ну, кто знает), или разные календари в разных регионах. Чтобы дать ответ на нашу маленькую головоломку выше, вы, вероятно, почти всегда хотите ММ-дд-гггг
.
cu
0xff
Оригинал: “https://dev.to/deepcode/deepcode-s-top-findings-1-java-date-this-one-made-me-dizzy-33c0”