在一行中设置日期

问题描述 投票:42回答:8

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

不过,我想的东西用更短(最好一到两条线路)来代替它。

java date calendar
8个回答
73
投票

你可以使用new GregorianCalendar(theYear, theMonth, theDay).getTime()

public GregorianCalendar(int year, int month, int dayOfMonth)

用给定的日期与默认语言环境的时区设置的GregorianCalendar。


22
投票

你可以使用

new SimpleDateFormat( "yyyyMMdd" ).parse( "20100520" )

14
投票

这是又一个理由使用Joda Time

new DateMidnight(2010, 3, 5)

DateMidnight现在已经过时,但同样的效果可与乔达时间DateTime实现

DateTime dt = new DateTime(2010, 3, 5, 0, 0);

10
投票

日历具有可设定的年,月,日,月,在一次调用set()方法:

myCal.set( theYear, theMonth, theDay );

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
}

然后调用这个无处不在你的代码的其余部分:

Calendar cal = DateUtils.calendarFor(2010, Calendar.MAY, 21);

4
投票

tl;dr

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.time框架构建在Java 8和更高版本取代了麻烦的老班,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 );

Convert

最好避免老日期时间类。但是,如果你一定要,你可以转换。呼叫加入到老班,以方便转换新方法。

在这种情况下,我们需要指定一个时间的日与我们的约会,只值一起去,被合并为一个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 );

About java.time

java.time框架是建立在Java 8和更高版本。这些类取代的麻烦老legacy日期时间类,如java.util.DateCalendar,与SimpleDateFormat

该项目Joda-Time,现在在maintenance mode,建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。和搜索堆栈溢出了很多例子和解释。规格是JSR 310

您可以直接与数据库交换java.time对象。使用符合JDBC driver或更高版本的JDBC 4.2。无需串,没有必要java.sql.*类。

从哪里获取java.time类?

该项目ThreeTen-Extra与java.time其他类延伸。该项目是为将来可能增加的java.time试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuartermore


2
投票
Date date = new DateTime(2014, 6, 20, 0, 0).toDate();

日期时间是从Joda.org https://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html


1
投票

使用构造Date(year,month,date)用Java 8被弃用:

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;

© www.soinside.com 2019 - 2024. All rights reserved.