将当前日期转换为整数

时间:2012-08-22 06:50:39

标签: java date

我想将当前日期转换为整数值。默认情况下,它返回long。当我尝试将long转换为整数时,之后我将整数值转换为日期,意味着它显示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位数字)?

12 个答案:

答案 0 :(得分:40)

问题是Integer不足以存储当前日期,您需要使用Long。

日期在内部存储为自1970年1月1日以来的毫秒数。

最大整数值为2147483648,而1970年以来的毫秒数目前为1345618537869

将最大整数值放入日期会产生1970年1月26日星期一。

编辑:根据以下评论显示除以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

答案 1 :(得分:7)

为了将当前日期作为整数(10位数字),您需要将从新Date()。getTime()返回的long除以1000.

这将在int范围内,并且一直持续到2038年1月18日。

答案 2 :(得分: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;
}

答案 3 :(得分:4)

如果您只需要一个表示自1970年1月1日以来经过的天数的整数,您可以尝试这些:

// 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);
}

希望这有帮助。

编辑:这可能会工作到7月11日星期五01:00:00 CET 5881580

答案 4 :(得分:2)

TL;博士

Instant.now().getEpochSecond()  // The number of seconds from the Java epoch of 1970-01-01T00:00:00Z.

详细

正如其他人所说的那样,32-bit整数不能保持一个足够大的数字来表示从纪元(1970年初在UTC开始)到现在的秒数。您需要64-bit整数(long原语或Long对象)。

java.time

其他答案使用旧的旧日期时间类。它们已被java.time类取代。

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds

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.

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 5 :(得分: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);

答案 6 :(得分:0)

你的问题是因为getTime()。它总是回归。

  

返回自此Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数。

因为最大整数值小于getTime()的返回值,显示原因 错误的结果。

答案 7 :(得分: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

您可能需要考虑以秒/分钟显示它。

答案 8 :(得分:0)

可能你不能,Long是比Integer更高的数据类型。

或此链接可能会帮助您

http://www.velocityreviews.com/forums/t142373-convert-date-to-integer-and-back.html

答案 9 :(得分:0)

尝试

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()

答案 10 :(得分:0)

从Java Dateint的转换:

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));
}

答案 11 :(得分:-1)

简单地创建一个长变量,表示程序的默认开始日期 获取另一个长变量的日期。 然后扣除长开始日期并转换为整数瞧 要阅读和转换回来只需添加而不是减去。 显然这取决于你需要多大的日期范围。