将日期设置为一行

时间:2010-05-20 20:26:32

标签: java date calendar

根据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();

但是,我希望用更短的东西替换它(理想情况下是一到两行)。

8 个答案:

答案 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)

TL;博士

LocalDate.of( 2015 , Month.JUNE , 7 )  // Using handy `Month` enum. 

...或...

LocalDate.of( 2015 , 6 , 7 )  // Sensible numbering, 1-12 for January to December. 

java.time

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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance 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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 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;