根据Java API,构造函数Date(year, month, day)
已被折旧。我知道我可以用以下代码替换它:
Calendar myCal = Calendar.getInstance();
myCal.set(Calendar.YEAR, theYear);
myCal.set(Calendar.MONTH, theMonth);
myCal.set(Calendar.DAY_OF_MONTH, theDay);
Date theDate = myCal.getTime();
但是,我希望用更短的东西替换它(理想情况下是一到两行)。
答案 0 :(得分:70)
您可以使用new GregorianCalendar(theYear, theMonth, theDay)
.getTime()
:
public GregorianCalendar(int year, int month, int dayOfMonth)
使用默认语言环境构造一个GregorianCalendar,并在默认时区中设置给定日期。
答案 1 :(得分:22)
您可以使用
new SimpleDateFormat( "yyyyMMdd" ).parse( "20100520" )
答案 2 :(得分:14)
这是使用Joda Time
的另一个原因new DateMidnight(2010, 3, 5)
现在不推荐使用DateMidnight,但使用Joda Time DateTime
可以达到同样的效果
DateTime dt = new DateTime(2010, 3, 5, 0, 0);
答案 3 :(得分:9)
日历有set()方法,可以在一次通话中设置年月,月和日:
myCal.set( theYear, theMonth, theDay );
答案 4 :(得分:5)
为什么不写一个简单的实用工具方法:
public final class DateUtils {
private DateUtils() {
}
public static Calendar calendarFor(int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DAY_OF_MONTH, day);
return cal;
}
// ... maybe other utility methods
}
然后在其余代码中随处调用:
Calendar cal = DateUtils.calendarFor(2010, Calendar.MAY, 21);
答案 5 :(得分:4)
LocalDate.of( 2015 , Month.JUNE , 7 ) // Using handy `Month` enum.
...或...
LocalDate.of( 2015 , 6 , 7 ) // Sensible numbering, 1-12 for January to December.
Java 8及更高版本中内置的java.time框架取代了麻烦的旧类java.util.Date/.Calendar。
java.time类使用immutable objects。所以它们本质上是线程安全的。您将不会在其他答案中提及thread-safety个问题。
LocalDate
此框架包含一个仅限日期对象的类,没有任何时间或时区LocalDate
。请注意,确定日期需要时区(ZoneId
)。
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
您可以实例化特定日期。请注意,与旧班级不同,月份编号是1-12的合理范围。
LocalDate localDate = LocalDate.of( 2015 , 6 , 7 );
或使用枚举Month
。
LocalDate localDate = LocalDate.of( 2015 , Month.JUNE , 7 );
最好避免使用旧的日期时间类。但如果你必须,你可以转换。调用添加到旧类的新方法以促进转换。
在这种情况下,我们需要指定一个时间段,与我们的仅限日期值一起使用,以组合成java.util.Date
个对象。一天的第一时刻可能有意义。让java.time确定第一个时刻的时间,因为它并不总是00:00:00.0
。
我们还需要指定时区,因为日期因时区而异。
ZoneId zoneId = zoneId.of( "America/Montreal" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );
Instant
是java.time中的基本类,表示UTC时间轴上的时刻。在日期转换为Instant
静态方法。
Instant instant = zdt.toInstant();
java.util.Date utilDate = java.util.Date.from( instant );
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。
答案 6 :(得分:2)
Date date = new DateTime(2014, 6, 20, 0, 0).toDate();
DateTime来自Joda.org https://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html
答案 7 :(得分:1)
不推荐使用Java 8中的构造函数Date(year,month,date)
:
Date date = new Date(1990, 10, 26, 0, 0);
最好的方法是使用SimpleDateFormat
DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Date date = format.parse("26/10/1985");
您需要导入import java.text.SimpleDateFormat;