В чем моя ошибка конвертировать дату в минуты? - PullRequest
0 голосов
/ 19 мая 2018

На основе Как преобразовать стандартную дату в минуты в java? Информация, я использую эту технику для преобразования даты в минуты, но выходные данные не являются ожидаемым значением (например, 12 часов -> этодолжно быть 720 минут).

Вот мой исходный код

    SimpleDateFormat sdf = new SimpleDateFormat("hh");
    Date theDate = sdf.parse ("12");
    long minutes22 = (theDate.getTime() / 1000)  / 60;
    System.out.println("Minute "+minutes22);

Выход -420.Может кто-нибудь объяснить мне?

<Первая проблема решена, пожалуйста, взгляните на раздел комментариев>

Новая проблема - вырезать строку.<Проблема также решена, пожалуйста, взгляните на раздел комментариев>

Для другого входа, который я пытался сделать самостоятельно, но после завершения резки строки возникает проблема.Я обнаружил, что дублирующее значение нельзя хранить отдельно.Я не знаю, почему это произошло, потому что я держал в другом индексе.Любое предложение?

Вот еще один мой другой исходный код.

    String date = "Sun 10:00-20:00\r\n" + 
            "Fri 05:00-10:00\r\n" + 
            "Fri 16:30-23:50\r\n" + 
            "Sat 10:00-24:00\r\n" + 
            "Sun 01:00-04:00\r\n" + 
            "Sat 02:00-06:00\r\n" + 
            "Tue 03:30-18:15\r\n" + 
            "Tue 19:00-20:00\r\n" + 
            "Wed 04:25-15:14\r\n" + 
            "Wed 15:14-22:40\r\n" + 
            "Thu 00:00-23:59\r\n" + 
            "Mon 05:00-13:00\r\n" + 
            "Mon 15:00-21:00";

    List<String> Hour = new ArrayList<String>();
    int loop = 0;

    String [] replacement = {"sun","mon","tue","wed","thu","fri","sat"};
    String new_s = date.toLowerCase().replaceAll(" ","");

    for(int j = 0;j<replacement.length;j++)
    {
        new_s = new_s.replace(replacement[j],"").replace("\r\n","");


    }

    String temp = "";
    temp = temp+new_s.replaceAll("-","");

    int show = 0;
    while(!temp.equals(""))
    {
        Hour.add(temp.substring(loop,loop+5));
        temp = temp.replace(temp.substring(0,loop+5),"");
        System.out.println("Hour "+Hour.get(show));
        show++;

    }

Вот вывод

Hour 10:00 Hour 20:00 Hour 05:00 Hour 16:30 Hour 23:50 Hour 24:00 Hour 01:00 Hour 04:00 Hour 02:00 Hour 06:00 Hour 03:30 Hour 18:15 Hour 19:00 Hour 04:25 Hour 15:14 Hour 22:40 Hour 00:00 Hour 23:59 Hour 13:00 Hour 15:00 Hour 21:00

Другой вопрос - зачем выводить <0 вместо 1200>

 LocalTime froms = LocalTime.parse("20:00", DateTimeFormatter.ofPattern("HH:mm", Locale.ENGLISH));
System.out.println("TIme "+froms.getMinute());'

Ответы [ 2 ]

0 голосов
/ 20 мая 2018
    String input = "Sun 11:00-20:00";
    String[] fromAndTo = input.split("-");
    LocalTime from = LocalTime.parse(fromAndTo[0], DateTimeFormatter.ofPattern("EEE H:mm", Locale.ENGLISH));
    LocalTime to = LocalTime.parse(fromAndTo[1]);
    System.out.println(Duration.between(from, to).toMinutes());

Это напечатано:

540

Может кто-нибудь объяснить мне?

У вас есть две ошибки, которые оба способствуютВаш неверный результат:

  • Вы неправильно использовали Date для продолжительности и не указали часовой пояс.
  • Вы использовали строчные буквы hh для часов в формате строки шаблона.hh относится к часу в AM или PM с 01 по 12, поэтому 12 означает то же, что и 0 (поскольку 12:00 AM совпадает с 00:00 на 24-часовых часах).

Ваш SimpleDateFormat понимал 12 как 00:00 в вашем местном часовом поясе (как определено настройкой часового пояса вашей JVM).Однако, когда вы берете миллисекунды, используя theDate.getTime(), вы получаете миллисекунды с 00:00 по UTC.Поскольку ваш часовой пояс имеет смещение от UTC, вы получаете ошибку, величина этого смещения.

0 голосов
/ 19 мая 2018

tl; dr

Duration.ofHours(12).toMinutes()

720

java.time.Duration

Вы используете проблемные старые унаследованные классы даты и времени.Более того, вы злоупотребляете ими.

Класс Date заменен классом Instant.Оба представляют момент, точку на временной шкале.Не злоупотребляйте ими, чтобы обозначить «двенадцать часов».

Очевидно, вы хотите представить промежуток времени, не привязанный к временной шкале.Так что используйте класс, предназначенный для этой цели, Duration.

Duration d = Duration.ofHours(12);

Чтобы увидеть общее количество минут за всю продолжительность, позвоните по номеру toMinutes.

long minutes = d.toMinutes();

About java.time

Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, а позже
    • Встроенный.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации комплекта Android классов java.time.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Вы можете найти здесь несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

...