Подтвердить что ты не робот

Как найти секунды с 1970 года в java

iam работает с проектом в реальном времени, где я получил требование найти секунды с 1970 года января 1. Я использовал следующий код, чтобы узнать секунды, но дает неправильный результат. Код выглядит следующим образом.

public long returnSeconds(int year, int month, int date) {
    Calendar calendar1 = Calendar.getInstance();
    Calendar calendar2 = Calendar.getInstance();
    calendar1.set(1970, 01, 01);
    calendar2.set(year, month, date);
    long milliseconds1 = calendar1.getTimeInMillis();
    long milliseconds2 = calendar2.getTimeInMillis();
    long diff = milliseconds2 - milliseconds1;
    long seconds = diff / 1000;
    return seconds;
}

В приведенном выше примере вместо year,month,date я прохожу 2011,10,1 и получаю

1317510000

но правильный ответ

1317427200

Любая помощь в этом отношении очень полезна мне.

4b9b3361

Ответ 1

Исходя из вашего желания, чтобы 1317427200 был выходным, есть несколько уровней проблем для адреса.

  • Сначала, как уже отмечали другие, java уже использует UTC 1/1/1970 epoch. Обычно нет необходимости вычислять эпоху и выполнять вычитание, если у вас нет странных правил локали.

  • Во-вторых, когда вы создаете новый календарь, он инициализируется "сейчас", поэтому он включает время суток. Изменение года/месяца/дня не влияет на поля времени суток. Поэтому, если вы хотите, чтобы он представлял полночь даты, вам нужно отключить календарь до того, как вы установите дату.

  • В-третьих, вы не указали, как вы должны обрабатывать часовые пояса. Дневная экономия может привести к разнице в абсолютном числе секунд, представленных конкретным календарем на стене, в зависимости от того, где работает JVM. Поскольку эпоха в UTC, мы, вероятно, хотим работать в UTC раз? Возможно, вам придется искать разъяснения у создателей системы, с которой вы взаимодействуете.

  • В-четвертых, месяцы в Java индексируются нулями. Январь - 0, октябрь - 9.

Объединяя все это

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendar.clear();
calendar.set(2011, Calendar.OCTOBER, 1);
long secondsSinceEpoch = calendar.getTimeInMillis() / 1000L;

который даст вам 1317427200

Ответ 2

Методы Calendar.getTimeInMillis() и Date.getTime() возвращают миллисекунды с 1.1.1970.

В течение текущего времени вы можете использовать:

long seconds = System.currentTimeMillis() / 1000l;

Ответ 4

Так как Java8:

java.time.Instant.now().getEpochSecond()

Ответ 5

Ответ, который вы хотите, "1317427200", достигается, если ваши контрольные месяцы - январь и октябрь. Если да, то даты, которые вы ищете, - 1970-JAN-01 и 2011-OCT-01, правильно?

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

См., если вы проверите документацию API календаря или даже предоставленные там константы ( "Calendar.JANUARY", "Calendar.FEBRUARY" и т.д.), вы обнаружите, что месяцы начинаются с 0 (январь).

Итак, проверяя свой код, вы проходите февраль и ноябрь, что приведет к "1317510000".

С уважением.

Ответ 6

Разница, которую вы видите, скорее всего, потому что вы не равны нулю поля часа, минуты, секунды и миллисекунды ваших экземпляров Calendar: Calendar.getInstance() дает текущую дату и время, как и new Date() или System.currentTimeMillis().

Обратите внимание, что поле месяца в календаре имеет нулевое значение, т.е. январь равен 0, а не 1.

Кроме того, не префиксные номера с нулем, это может показаться приятным и даже работать до 8: 08 не является допустимой цифрой в Java. Префиксные цифры с нулем делают компилятор предполагаемым, вы определяете их как восьмеричные цифры, которые работают только до 07 (для отдельных цифр).

Просто отпустите calendar1 полностью (1970-01-01 00: 00: 00'000 - это начало эпохи, то есть нуль в любом случае) и выполните следующее:

public long returnSeconds(int year, int month, int date) {
    final Calendar cal = Calendar.getInstance();
    cal.set(year, month, date, 0, 0, 0);
    cal.set(Calendar.MILLISECOND, 0);
    return cal.getTimeInMillis() / 1000;
}

Ответ 7

java.time

Использование рамки java.time, встроенной в Java 8 и более поздних версий.

import java.time.LocalDate;
import java.time.ZoneId;

int year = 2011;
int month = 10;
int day = 1;
int date = LocalDate.of(year, month, day);

date.atStartOfDay(ZoneId.of("UTC")).toEpochSecond; # Long = 1317427200

Ответ 8

Вместо передачи года, месяца и дня пропустите метку времени и используйте методы из класса Timestamp. Проверьте эту ссылку: http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/Timestamp.html

Сообщите мне, есть ли у вас больше сомнений. Спасибо.