hib*_*ate 46 java calendar date
根据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();
Run Code Online (Sandbox Code Playgroud)
但是,我想用更短的东西替换它(理想情况下是一到两行).
aio*_*obe 74
你可以使用:new GregorianCalendar(theYear, theMonth, theDay)
.getTime()
public GregorianCalendar(int year, int month, int dayOfMonth)
使用默认区域设置在默认时区中设置给定日期的GregorianCalendar构造.
tan*_*ens 22
你可以用
new SimpleDateFormat( "yyyyMMdd" ).parse( "20100520" )
Run Code Online (Sandbox Code Playgroud)
Sea*_*wen 14
这是使用Joda Time的另一个原因
new DateMidnight(2010, 3, 5)
Run Code Online (Sandbox Code Playgroud)
DateMidnight现已弃用,但使用Joda Time可以实现相同的效果 DateTime
DateTime dt = new DateTime(2010, 3, 5, 0, 0);
Run Code Online (Sandbox Code Playgroud)
mar*_*ton 10
Calendar有一个set()方法,可以在一次调用中设置年,月和日:
myCal.set( theYear, theMonth, theDay );
Run Code Online (Sandbox Code Playgroud)
LocalDate.of( 2015 , Month.JUNE , 7 ) // Using handy `Month` enum.
Run Code Online (Sandbox Code Playgroud)
…或者…
LocalDate.of( 2015 , 6 , 7 ) // Sensible numbering, 1-12 for January to December.
Run Code Online (Sandbox Code Playgroud)
Java 8 及更高版本中内置的 java.time 框架取代了麻烦的旧类 java.util.Date/.Calendar。
java.time 类使用不可变对象。所以它们本质上是线程安全的。您将不会遇到其他答案中提到的任何线程安全问题。
LocalDate
该框架包括一个用于没有任何时间或时区的仅日期对象的类,LocalDate
. 请注意,时区 ( ZoneId
) 是确定日期所必需的。
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
Run Code Online (Sandbox Code Playgroud)
您可以实例化特定日期。请注意,与旧类不同,月份数是 1-12 的合理范围。
LocalDate localDate = LocalDate.of( 2015 , 6 , 7 );
Run Code Online (Sandbox Code Playgroud)
或者使用枚举,Month
.
LocalDate localDate = LocalDate.of( 2015 , Month.JUNE , 7 );
Run Code Online (Sandbox Code Playgroud)
最好避免使用旧的日期时间类。但如果你必须,你可以转换。调用添加到旧类中的新方法以方便转换。
在这种情况下,我们需要指定一个时间与我们的仅日期值一起使用,以组合为一个java.util.Date
对象。一天中的第一个时刻可能是有道理的。让 java.time 确定第一时刻的时间,因为它并非总是如此00:00:00.0
。
我们还需要指定一个时区,因为日期因时区而异。
ZoneId zoneId = zoneId.of( "America/Montreal" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );
Run Code Online (Sandbox Code Playgroud)
AnInstant
是 java.time 中的一个基本类,代表 UTC 时间线上的一个时刻。Instant
在 Date 上提供一个to 静态方法以进行转换。
Instant instant = zdt.toInstant();
java.util.Date utilDate = java.util.Date.from( instant );
Run Code Online (Sandbox Code Playgroud)
该java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date
, Calendar
, & SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310。
您可以直接与您的数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*
从哪里获得 java.time 类?
该ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。
你为什么不写一个简单的实用工具方法:
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
}
Run Code Online (Sandbox Code Playgroud)
然后在其余代码中随处调用:
Calendar cal = DateUtils.calendarFor(2010, Calendar.MAY, 21);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
128454 次 |
最近记录: |