Преобразование текущей даты как целого - программирование
Подтвердить что ты не робот

Преобразование текущей даты как целого

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

4b9b3361

Ответ 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

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

Ответ 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 Чтобы читать и конвертировать назад, просто добавьте, а не вычитайте. очевидно, это зависит от того, насколько большой диапазон дат вам нужен.