我想将当前日期转换为整数值。默认情况下,它返回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位数字)?
答案 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)
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类取代。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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 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));
}
答案 11 :(得分:-1)
简单地创建一个长变量,表示程序的默认开始日期 获取另一个长变量的日期。 然后扣除长开始日期并转换为整数瞧 要阅读和转换回来只需添加而不是减去。 显然这取决于你需要多大的日期范围。