Привет, 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”