Рубрики
Без рубрики

Главные выводы Deep Code # 1: Дата Java (от этого у меня закружилась голова)

Привет, Deep Code предлагает статический программный анализ на основе искусственного интеллекта для Java, Javascript и Typescript, а также Put… Помеченный статическим анализом кода, deepcode, java, datetime.

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