我在Java中有一个Date对象。有时日期的年份设置为17.当我使用SimpleDateFormat输出它时,它将打印为0017.我所有的年份都将在2000年。有没有办法检查年份是否低于某个值,如果是,则加上2000?然后,一旦这样做,如何重新创建Date对象以使用新的一年?似乎不推荐使用Date对象中的所有内容。
答案 0 :(得分:3)
我会使用日历:
Date myDate = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(myDate);
int year = cal.get(Calendar.YEAR);
if(year < 2000)
cal.add(Calendar.YEAR, 2000); // add two thousand years
答案 1 :(得分:2)
如果您使用日历或Joda Time(更好的选择),您可以获取并设置年份(或其他字段)
你的年份不应该是17岁。我会尝试在源头纠正问题而不是稍后修补它。
答案 2 :(得分:1)
首先,Date.getYear返回CurrentYear - 1900,而不是2000,看起来你每次都要做这个增量。
但是因为它已被弃用,所以如果可能的话,你不应该首先使用它。 API建议您改为使用日历类:http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html
答案 3 :(得分:1)
如果用Date
来表示java.util.Date
,那可怕的设计类现在已经过时,几年前已被JSR 310中定义的 java.time 类所取代。
使用添加到旧类中的新方法将其替换为Instant
。
Instant instant = myJavaUtilDate.toInstant() ;
Instant
和java.util.Date
都表示UTC时刻。对于任何给定时刻,全球范围内的日期和时间都会有所不同。如果要通过特定时区的挂钟时间查看日期,请应用ZoneId
以获得ZonedDateTime
。
ZoneID z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDatetTime zdt = instant.atZone( z ) ;
现在审问这一年。
int year = zdt.getYear() ;
调整。如果不同年份的日期无效(非leap年的2月29日),则ZonedDateTime
类将进行调整。
if( year < 1000 ) {
zdt = zdt.withYear( year + 2000 ) ; // You might also want to check for negative numbers. I'll omit that from this demo.
}
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 4 :(得分:0)
我强烈建议使用Joda-Time。为什么? API更好,更直观,并且不会遇到困扰SimpleDateFormat等的线程问题。或者大量的弃用会淹没当前的Date
API。