Преобразование текущей даты как целого
Я хочу преобразовать текущую дату в виде целочисленной формы. По умолчанию он возвращается долго. Когда я пытаюсь преобразовать long как integer, а затем я конвертирую целочисленное значение в дату, значит он показывает дату 1970 года.
int i = (int) new Date().getTime();
System.out.println("Integer : " + i);
System.out.println("Long : "+ new Date().getTime());
System.out.println("Long date : " + new Date(new Date().getTime()));
System.out.println("Int Date : " + new Date(i));
выход будет
Integer : 1292838124
Long : 1345617601771
Long date : Wed Aug 22 12:10:01 IST 2012
Int Date : Fri Jan 16 04:37:18 IST 1970
Любой, пожалуйста, помогите мне, как преобразовать текущую дату в целое число (10-значное число)
Ответы
Ответ 1
Проблема в том, что Integer недостаточно велик для хранения текущей даты, вам нужно использовать Long.
Дата хранится внутренне как количество миллисекунд с 1/1/1970.
Максимальное целочисленное значение равно 2147483648, тогда как число миллисекунд с 1970 года в настоящее время составляет порядка 1345618537869
Ввод максимального целочисленного значения в дату дает понедельник 26 января 1970 года.
Изменить: код для отображения деления на 1000 в соответствии с комментарием ниже:
int i = (int) (new Date().getTime()/1000);
System.out.println("Integer : " + i);
System.out.println("Long : "+ new Date().getTime());
System.out.println("Long date : " + new Date(new Date().getTime()));
System.out.println("Int Date : " + new Date(((long)i)*1000L));
Integer : 1345619256
Long : 1345619256308
Long date : Wed Aug 22 16:37:36 CST 2012
Int Date : Wed Aug 22 16:37:36 CST 2012
Ответ 2
Чтобы получить текущую дату как целое (10-значное число), вам нужно разделить длинный, возвращаемый с новой Date(). getTime() на 1000.
Это будет в пределах диапазона и будет хорошим до 18 января 2038 года.
Ответ 3
Вам нужно что-то подобное (без времени)?
public static Integer toJulianDate(Date pDate) {
if (pDate == null) {
return null;
}
Calendar lCal = Calendar.getInstance();
lCal.setTime(pDate);
int lYear = lCal.get(Calendar.YEAR);
int lMonth = lCal.get(Calendar.MONTH) + 1;
int lDay = lCal.get(Calendar.DATE);
int a = (14 - lMonth) / 12;
int y = lYear + 4800 - a;
int m = lMonth + 12 * a - 3;
return lDay + (153 * m + 2) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 32045;
}
Ответ 4
Если вам нужно только целое число, представляющее истекшие дни с 1 января 1970 года, вы можете попробовать следующее:
// magic number=
// millisec * sec * min * hours
// 1000 * 60 * 60 * 24 = 86400000
public static final long MAGIC=86400000L;
public int DateToDays (Date date){
// convert a date to an integer and back again
long currentTime=date.getTime();
currentTime=currentTime/MAGIC;
return (int) currentTime;
}
public Date DaysToDate(int days) {
// convert integer back again to a date
long currentTime=(long) days*MAGIC;
return new Date(currentTime);
}
Более короткий, но менее читаемый (немного быстрее?):
public static final long MAGIC=86400000L;
public int DateToDays (Date date){
return (int) (date.getTime()/MAGIC);
}
public Date DaysToDate(int days) {
return new Date((long) days*MAGIC);
}
Надеюсь, что это поможет.
РЕДАКТОР: Это может сработать до пт. 11 июля 01:00:00 CET 5881580
Ответ 5
ТЛ; др
Instant.now().getEpochSecond() // The number of seconds from the Java epoch of 1970-01-01T00:00:00Z.
подробности
Как говорили другие, 32-разрядное целое число не может содержать достаточно большое число для количества секунд с эпохи (начало 1970 года в UTC) и сейчас. Вам нужно 64-битное целое число (long
примитив или Long
объект).
java.time
Другие ответы используют старые устаревшие классы даты и времени. Они были вытеснены классами java.time.
Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунд.
Instant now = instant.now() ;
Вы можете опрашивать количество миллисекунд с начала эпохи. Остерегайтесь, это означает потерю данных, сокращая наносекунды до миллисекунд.
long millisecondsSinceEpoch = now.toEpochMilli() ;
Если вы хотите подсчитать количество наносекунд с начала эпохи, вам нужно будет немного toEpochNano
поскольку в классе странным образом отсутствует метод toEpochNano
. Обратите внимание, что L
добавлен к миллиарду, чтобы вызвать вычисления как 64-битные длинные целые числа.
long nanosecondsSinceEpoch = ( instant.getEpochSecond() * 1_000_000_000L ) + instant.getNano() ;
Целых секунды с эпохи
Но конец Вопроса требует 10-значного числа. Я подозреваю, что это означает количество полных секунд с 1970-01-01T00: 00: 00. Обычно это называется Unix Time или Posix Time.
Мы можем опросить Instant
для этого номера. Опять же, это означает потерю данных с усечением любой доли секунды, которую может содержать этот объект.
long secondsSinceEpoch = now.getEpochSecond() ; // The number of seconds from the Java epoch of 1970-01-01T00:00:00Z.
О 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?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.
Ответ 6
Я решил это, как показано ниже:
long year = calendar.get(Calendar.YEAR);
long month = calendar.get(Calendar.MONTH) + 1;
long day = calendar.get(Calendar.DAY_OF_MONTH);
long calcDate = year * 100 + month;
calcDate = calcDate * 100 + day;
System.out.println("int: " + calcDate);
Ответ 7
Ваша проблема связана с getTime(). он всегда возвращается.
Возвращает количество миллисекунд с 1 января 1970 года, 00:00:00 GMT, представленное этим объектом Date.
Так как максимальное целочисленное значение меньше возвращаемого значения на getTime()
, то почему
неправильный результат.
Ответ 8
На моей Java 7 вывод отличается:
Integer : 1293732698
Long : 1345618496346
Long date : Wed Aug 22 10:54:56 MSK 2012
Int Date : Fri Jan 16 02:22:12 MSK 1970
который является ожидаемым поведением.
Невозможно отобразить текущую дату в миллисекундах в виде целого числа (10-значное число), поскольку последняя возможная дата Sun Apr 26 20:46:39 MSK 1970
:
Date d = new Date(9999_9999_99L);
System.out.println("Date: " + d);
Date: Sun Apr 26 20:46:39 MSK 1970
Возможно, вы захотите просмотреть его в секундах/минутах.
Ответ 9
Вероятно, вы не можете, Long - более высокий тип данных, чем Integer.
или эта ссылка может помочь вам
http://www.velocityreviews.com/forums/t142373-convert-date-to-integer-and-back.html
Ответ 10
Попробуй это
Calendar currentDay= Calendar.getInstance();
int currDate= currentDay.get(Calendar.DATE);
int currMonth= currentDay.get(Calendar.MONTH);
int currYear= currentDay.get(Calendar.YEAR);
System.out.println(currDate + "-" + currMonth + "-" + currYear);
альтернативный способ использования LocalDate.
LocalDate today = LocalDate.now();
int currentDate= today.getDayOfMonth();
int currentMonth= today.getMonthValue();
int currentYear= today.getYear()
Ответ 11
Java Date
преобразования в int
:
public static final String DATE_FORMAT_INT = "yyyyMMdd";
public static Integer getDateInt(Date date) {
if (isNull(date)) {
throw new IllegalArgumentException("Date must not be NULL");
}
return parseInt(format(date, DATE_FORMAT_INT));
}
Ответ 12
Просто создайте длинную переменную, представляющую начальную дату по умолчанию для вашей программы
Получите дату для другой длинной переменной.
Затем вычитайте длинную дату начала и конвертируйте в целое число voila
Чтобы читать и конвертировать назад, просто добавьте, а не вычитайте.
очевидно, это зависит от того, насколько большой диапазон дат вам нужен.