Конвертировать Текущую дату как целое

17

Я хочу преобразовать текущую дату в виде целочисленной формы. По умолчанию он возвращается долго. Когда я пытаюсь преобразовать 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-значное число)

    
задан Bathakarai 22.08.2012 в 08:50
источник
  • o / p is: Integer: 1293630553, Long: 1345618394201, Long date: Wed Aug 22 12:23:14 IST 2012, Int Дата: Пт 16 января 04:50:30 IST 1970 –  Nandkumar Tekale 22.08.2012 в 08:54
  • Я думаю, что вы дали неверный результат –  Nandkumar Tekale 22.08.2012 в 09:03
  • Извините за мою ошибку. Теперь я меняю ее –  Bathakarai 22.08.2012 в 09:04
  • Требуется ли целое число, потому что операция jdbc использует prepareStatement.setInt (aInt)? –  Brian 26.06.2013 в 13:54

10 ответов

31

Проблема в том, что 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
    
ответ дан shonky linux user 22.08.2012 в 08:56
источник
  • Спасибо, Шонки, я принимаю ваш ответ. Но мое требование состоит в том, чтобы поддерживать только целое число недолго. Есть ли другой способ достичь моего требования. –  Bathakarai 22.08.2012 в 09:01
  • Если вы хотите жить с разрешением в одну секунду (вы потеряете миллисекундный компонент даты), вы можете разделить на 1000 до хранения целого числа. И умножьте, чтобы преобразовать обратно. Однако это будет иметь ограниченный срок службы (что-то вроде проблемы 2000 года) - до 2038 года. –  shonky linux user 22.08.2012 в 09:02
  • Я добавил код в свой ответ, чтобы продемонстрировать это предложение выше –  shonky linux user 22.08.2012 в 09:09
  • FYI, считая целые секунды с начала 1970 UTC, игнорируя секунды прыжка, называется Unix Time. –  Basil Bourque 24.11.2014 в 01:10
6

Чтобы получить текущую дату как целое (10-значное число), вам нужно разделить длинный, возвращаемый с новой Date (). getTime () на 1000.

Это будет в пределах диапазона и будет хорошим до 18 января 2038 года.

    
ответ дан KG2289 22.08.2012 в 09:13
источник
4

Вам нужно что-то подобное (без времени)?

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;
}
    
ответ дан Stefan Beike 22.08.2012 в 09:00
источник
  • спасибо. Вы решили мою проблему. –  Ponting 26.06.2013 в 11:48
  • @Stefan Спасибо за решение. Но не могли бы вы объяснить, что происходит здесь. –  Droidme 06.03.2018 в 11:50
2

Если вам нужно только целое число, представляющее истекшие дни с 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

    
ответ дан Rudy 10.07.2014 в 20:38
источник
1

Я решил это, как показано ниже:

    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);
    
ответ дан Zamir García 20.02.2015 в 21:40
источник
  • Этот вопрос уже решен, и, поскольку ему более 2 лет, кажется, нет причин добавлять еще один ответ. –  mbomb007 20.02.2015 в 21:47
  • В этом ответе не рассматривается вопрос. Вопрос задал вопрос о том, как поместить число в int, а не в длинный. Правильный принятый ответ объясняет, что это невозможно. –  Basil Bourque 21.02.2015 в 06:23
  • спасибо за помощь –  user49557 17.10.2015 в 17:44
0

Ваша проблема связана с getTime ( ) . он всегда возвращается.

  

Возвращает количество миллисекунд с 1 января 1970 года, 00:00:00 GMT, представленное этим объектом Date.

Так как максимальное целочисленное значение меньше возвращаемого значения на getTime() , то почему неправильный результат.

    
ответ дан Sumit Singh 22.08.2012 в 08:58
источник
0

На моей 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

Возможно, вы захотите просмотреть его в секундах / минутах.

    
ответ дан khachik 22.08.2012 в 09:01
источник
0

Вероятно, вы не можете, Long - более высокий тип данных, чем Integer.

или эта ссылка может помочь вам

Ссылка

    
ответ дан imhardik 22.08.2012 в 09:08
источник
  • Пожалуйста, не включайте в свои ответы ссылку «подписи» или ссылку на свой сайт. Вы можете поместить эту информацию в свой профиль. –  Andrew Barber 18.10.2012 в 11:17
0

TL; др

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 . Обратите внимание, что 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.
    
ответ дан Basil Bourque 13.08.2016 в 01:02
источник
-1

Просто создайте длинную переменную, представляющую начальную дату по умолчанию для вашей программы Получите дату для другой длинной переменной. Затем вычитайте длинную дату начала и конвертируйте в целое число voila Чтобы читать и конвертировать назад, просто добавьте, а не вычитайте. очевидно, это зависит от того, насколько большой диапазон дат вам нужен.

    
ответ дан B9JFH 23.11.2014 в 22:47
источник