Как найти секунды с 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
Любая помощь в этом отношении очень полезна мне.
Ответы
Ответ 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;
Ответ 3
Это Date.getTime().
Ответ 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
Сообщите мне, есть ли у вас больше сомнений. Спасибо.