将日期设置为一行

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构造.

  • 请记住,1月是0而不是1.或者使用日历常量:Calendar.JANUARY等. (14认同)
  • 我相信这是你应该如何做的"官方Java正确答案".就我个人而言,我喜欢在三个字段中有年,月,日,我通常有一些形式的字符串,所以我使用SimpleDateFormat. (2认同)

tan*_*ens 22

你可以用

new SimpleDateFormat( "yyyyMMdd" ).parse( "20100520" )
Run Code Online (Sandbox Code Playgroud)

  • @stacker:这个答案中什么不是线程安全的? (6认同)
  • 应该提到SimpleDateFormat不是线程安全的 (3认同)
  • @stacker:SimpleDataTime的实例不是线程安全的,但是该类肯定是安全的。实例化线程上的新副本并使用它(如示例中所示)永远不会成为问题,即使有多个线程同时执行它-每个线程将拥有自己的副本。但是,由于其他原因,这可能不是最有效或最正确的答案。 (2认同)

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)

  • 引入第三方库对这种简单事物的依赖似乎是一种矫枉过正. (5认同)

mar*_*ton 10

Calendar有一个set()方法,可以在一次调用中设置年,月和日:

myCal.set( theYear, theMonth, theDay );
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 7

tl;博士

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.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 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


Jes*_*per 6

你为什么不写一个简单的实用工具方法:

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)