Час и минуты в миллисекундах с начала дня - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь решить эту ошибку, но мне ничего не помогло:

Calendar cal = Calendar.getInstance();
cal.setTimeZone( TimeZone.getDefault() );
long oraPrecisa     =   cal.getTimeInMillis();
Log.e( "" , "oraPrecisa: " + new DateFormat().format( "HH:mm", oraPrecisa ).toString() );

cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 1 );

oraPrecisa  =   oraPrecisa - cal.getTimeInMillis();
Log.e( "" , "OraPrecisa 2: " + new DateFormat().format( "HH:mm", oraPrecisa ).toString() );

Возвращает этот вывод:

OraPrecisa: 13:58
OraPrecisa 2: 14:58

Я получаю ошибку за один час (из-за часового пояса, который я предполагаютак как я нахожусь в GMT + 1), любая помощь?

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

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

Если вы выполняете свой код другим способом, разница отображается правильно:

import java.util.Calendar;
import java.util.TimeZone;
import java.text.DateFormat;
public class HelloWorld{

     public static void main(String []args){
        Calendar cal = Calendar.getInstance();
        cal.setTimeZone( TimeZone.getDefault() );
        long oraPrecisa     =   cal.getTimeInMillis();


        cal.set( Calendar.HOUR_OF_DAY, 0 );
        cal.set( Calendar.MINUTE, 0 );
        cal.set( Calendar.SECOND, 0 );
        cal.set( Calendar.MILLISECOND, 1 );

        oraPrecisa  =   oraPrecisa - cal.getTimeInMillis();

        oraPrecisa = oraPrecisa / 1000; 
        int hh = (int)(oraPrecisa  / 60 / 60);
        int mm = (int) ( ( oraPrecisa - (hh * 60 * 60) ) / 60 );
        int ss = (int) (oraPrecisa - hh * 60 * 60 - mm * 60);

        System.out.println(String.format("Diff: %2d:%2d:%2d",hh,mm,ss));

    }
}
0 голосов
/ 04 июня 2018

java.time

Если вы хотите преобразовать время дня в миллисекунды:

    ZoneId zone = ZoneId.of("Europe/Rome");
    LocalTime timeOfDay = LocalTime.now(zone);
    long milliOfDay = TimeUnit.NANOSECONDS.toMillis(timeOfDay.toNanoOfDay());
    System.out.println(milliOfDay);

Если вместо этого я буду воспринимать его буквально, когда вы спрашиваете количество миллисекунд с моментаначало дня:

    ZonedDateTime now = ZonedDateTime.now(zone);
    ZonedDateTime startOfDay = now.toLocalDate().atStartOfDay(zone);
    Duration dur = Duration.between(startOfDay, now);
    long millisSinceStartOfDay = dur.toMillis();
    System.out.println(millisSinceStartOfDay);

Когда я только что запустил эти два фрагмента (15:18:28 в Италии), они оба напечатали

55108833

Есть ли разница, тогда?В большинстве случаев два приведенных выше фрагмента будут выводить один и тот же результат.Однако, если, например, существует переход на летнее время или обратно (летнее время) ранее в тот же день, местное время не будет отражать время, прошедшее с начала дня, и тогда фрагменты будут давать разные результаты.Поэтому вы должны тщательно выбрать, какой из них вы хотите.

Поскольку количество миллисекунд с полуночи никогда не превысит int, вы можете безопасно привести его к этому типу, если хотите.

Вместо давно устаревшего и плохо спроектированного Calendar класса я использую java.time, современный Java-интерфейс даты и времени.С ним гораздо приятнее работать.

Вопрос: Можно ли использовать java.time на Android?

Да, java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26, как мне сказали), современный API поставляется встроенным.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. ссылки внизу).
  • На (более старом) использовании AndroidAndroid-версия ThreeTen Backport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

0 голосов
/ 02 июня 2018

обратите внимание на заданную часть для вашего класса Календаря, там что-то не так:

set (f, value) меняет поле календаря f на значение.Кроме того, он устанавливает внутреннюю переменную-член, чтобы указать, что поле календаря f было изменено.Хотя поле календаря f изменяется немедленно, значение времени календаря в миллисекундах не пересчитывается до следующего вызова get (), getTime (), getTimeInMillis (), add () или roll ().Таким образом, множественные вызовы set () не запускают несколько ненужных вычислений.В результате изменения поля календаря с помощью set () другие поля календаря также могут изменяться в зависимости от поля календаря, значения поля календаря и системы календаря.Кроме того, get (f) не обязательно вернет значение, установленное вызовом метода set, после пересчета полей календаря.Специфика определяется конкретным календарным классом.

refrence

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...