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

Ошибка, которая может стоить вам миллионы долларов!!!

ISO 8601 ISO 8601 Существует практический международный стандарт для обработки даты и времени, ISO… Помеченный как java, spring boot, coding.

ISO 8601

ISO 8601 Существует практический международный стандарт для обработки даты и времени, ISO 8601. Определение недели в стандарте ISO 8601 таково: Недели начинаются в понедельник, Неделя № 1 приходится на первый четверг года, год состоит либо из 52, либо из 53 недель. В году может быть один или несколько дней из предыдущего календарного года, а также из следующего календарного года.

Типы года

В java существует 2 типа года, которые заключаются в следующем:

  1. Основанный На Неделях Год
  2. Основанный на Эпохе Год

Основанный на неделе год синхронизирован с циклом WEEK_OF_YEAR, но основанный на неделе год является обычным календарным годом.

Как получить дату в java

Способ 1. Использование года, основанного на эпохе (С использованием маленького алфавита “y” для года)
Date date = new SimpleDateFormat("yyyy/MM/dd").parse("2019/12/31");
Способ 2. Использование года на основе недели (С использованием заглавного алфавита “Y” для года)
Date date = new SimpleDateFormat("YYYY/MM/dd").parse("2019/12/31");

Проблема в разных методах получения даты

Для всех недель года любой метод вычисления даты (на основе эпохи/недели) будет работать нормально. Проблема возникает только в течение 1-й недели и последней недели года. Пример: 1 января 2020 года – среда. Если getFirstDayOfWeek() – ПОНЕДЕЛЬНИК, а getMinimalDaysInFirstWeek() – 5 (настройка, совместимая со стандартом ISO 8601), то 1-я неделя 2020 года начинается 30 декабря 2019 года и заканчивается 5 января 2020 года. Недельный год – 2020 для последних двух дней 2019 календарного года. Если, однако, getFirstDayOfWeek() – ВОСКРЕСЕНЬЕ, то 1-я неделя 2020 года начинается 5 января 2020 года и заканчивается 11 января 2020 года; первые четыре дня 2020 года являются частью 53-й недели 2019 года, а их неделя – 2019 год.

Понимание проблемы с помощью кода

использование года на основе эпохи (‘y) для получения данных, но года на основе недели (‘Y’) для форматирования даты
Date date = new SimpleDateFormat("yyyy/MM/dd").parse("2019/12/31");
String result = new SimpleDateFormat("YYYY/MM/dd").format(date);   

//result '2020/12/31' which is unexpected

использование года на основе эпохи (‘y) для получения данных и года на основе эпохи (‘y) для форматирования даты
Date date = new SimpleDateFormat("yyyy/MM/dd").parse("2019/12/31");
String result = new SimpleDateFormat("yyyy/MM/dd").format(date);   

//result '2019/12/31' as expected

Все комбинации года, основанного на неделе, и года, основанного на эпохе
package codechef;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateMethodsExplore {

  public static void main(String[] args) throws ParseException {
    Date date1 = new SimpleDateFormat("yyyy/MM/dd").parse("2019/12/31");
    String result1 = new SimpleDateFormat("yyyy/MM/dd").format(date1);
    System.out.println("date 1 =>" + result1);
    System.out.println("**************");

    Date date2 = new SimpleDateFormat("YYYY/MM/dd").parse("2019/12/31");
    String result2 = new SimpleDateFormat("YYYY/MM/dd").format(date2);
    System.out.println("date 2 =>" + result1);
    System.out.println("**************");

    Date date3 = new SimpleDateFormat("yyyy/MM/dd").parse("2019/12/31");
    String result3 = new SimpleDateFormat("YYYY/MM/dd").format(date3);
    System.out.println("date 3 =>" + result3);
    System.out.println("**************");

    Date date4 = new SimpleDateFormat("YYYY/MM/dd").parse("2019/12/31");
    String result4 = new SimpleDateFormat("yyyy/MM/dd").format(date4);
    System.out.println("date 4 =>" + result4);
    System.out.println("**************");
  }
}
//output
date 1 =>2019/12/31
**************
date 2 =>2019/12/31
**************
date 3 =>2020/12/31
**************
date 4 =>2018/12/30
**************

Почему создается год, основанный на неделях

Есть много вариантов использования, например, если мы хотим увидеть еженедельный курс акций компании в течение финансового года (для Индии: с 1 апреля по 31 марта следующего года), то для построения графика можно использовать недельный график, чтобы лучше отображать статистику.

Вывод

На самом деле это зависит от варианта использования, какой год вы хотите использовать, но при форматировании оба метода не должны смешиваться.

Оригинал: “https://dev.to/sainiankitsaini/bug-that-can-cost-you-millions-of-dollars-h68”