在午夜时间用Java获取今天的date

我需要创build两个date对象。 如果当前date和时间是2012年3月9日上午11:30

  • date对象d1应该是2012年3月9日12:00 AM
  • date对象d2应该包含当前date本身

date不会被input,它是系统date。

更新

Date dt = new Date(); System.out.print(dt.toString()); 

给出当前date和时间

  Calendar c = new GregorianCalendar(); c.set(Calendar.HOUR_OF_DAY, 0); //anything 0 - 23 c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); Date d1 = c.getTime(); //the midnight, that's the first second of the day. 

应该是2012年3月5日星期五00:00:00

 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm"); System.out.println(sdf.format(date)); 
 Calendar currentDate = Calendar.getInstance(); //Get the current date SimpleDateFormat formatter= new SimpleDateFormat("yyyy/MMM/dd HH:mm:ss"); //format it as per your requirement String dateNow = formatter.format(currentDate.getTime()); System.out.println("Now the date is :=> " + dateNow); 

这是一个基于Java 8的解决scheme,使用新的java.time包 ( Tutorial )。

如果您可以在代码中使用Java 8对象,请使用LocalDateTime

 LocalDateTime now = LocalDateTime.now(); // current date and time LocalDateTime midnight = now.toLocalDate().atStartOfDay(); 

如果您需要遗留date,即java.util.Date

使用这些转换将上面创build的LocalDateTime转换为Date

LocalDateTime – > ZonedDateTime – > Instant – > Date

  1. 使用指定的时区(或系统默认时区的ZoneId.systemDefault()调用atZone(zone)以创buildZonedDateTime对象,并根据需要对DST进行调整。

     ZonedDateTime zdt = midnight.atZone(ZoneId.of("America/Montreal")); 
  2. 调用toInstant()ZonedDateTime转换为Instant

     Instant i = zdt.toInstant() 
  3. 最后,调用Date.from(instant)Instant转换为Date

     Date d1 = Date.from(i) 

总之,它会看起来类似于你:

 LocalDateTime now = LocalDateTime.now(); // current date and time LocalDateTime midnight = now.toLocalDate().atStartOfDay(); Date d1 = Date.from(midnight.atZone(ZoneId.systemDefault()).toInstant()); Date d2 = Date.from(now.atZone(ZoneId.systemDefault()).toInstant()); 

另请参阅 传统date – 时间代码(Java™教程)一节 ,了解新的java.timefunction与传统java.util类的互操作性。

如果您能够将外部库添加到您的项目。 我会build议你试试乔达时间。 它有一个非常聪明的方式与date工作。

http://joda-time.sourceforge.net/

当前date和时间:

 String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime()); 

这将显示为:

Feb 5,2013 12:40:24 PM

 private static Date truncateTime(Calendar cal) { cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); return new Date(cal.getTime().getTime()); } public static void main(String[] args) throws Exception{ Date d2 = new Date(); GregorianCalendar cal = new GregorianCalendar(); cal.setTime(d2); Date d1 = truncateTime( cal ); System.out.println(d1.toString()); System.out.println(d2.toString()); } 
 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date date = new Date(); System.out.println(dateFormat.format(date)); //2014/08/06 15:59:4 

使用org.apache.commons.lang3.time.DateUtils

 Date pDate = new Date(); DateUtils.truncate(pDate, Calendar.DAY_OF_MONTH); 

Java 8中的解决scheme:

 Date startOfToday = Date.from(ZonedDateTime.now().with(LocalTime.MIN).toInstant()); 

定义“午夜”

“午夜”这个词很难定义。

有些人认为这是新的一天开始之前的一刻。 试图用软件来performance这一点,就像一天中的最后一刻一样,总是可以细分为一小部分。

我build议一个更好的思考方式是获得“一天中的第一个时刻”。

这支持将一段时间定义为“半开放”的常用方法,其中开始是包含性的,而结尾是排他性的。 所以整天都是从一天的第一个时刻开始,一直跑到第二天的第一刻,但不包括在内。 整天想这样(注意date从3日到4日):

2016-02-03T00:00:00.0-08:00 [美国/洛杉矶] /2016-02-04T00:00:00.0-08:00 [美国/洛杉矶]

乔达时间

如果使用Joda-Time库,请使用withTimeAtStartOfDay

请注意我们如何指定时区。 如果省略,则隐式应用JVM当前的默认时区。 最好是明确的。

 DateTime todayStart = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay() ; 

如果使用Java 8或更高版本,最好使用Java内置的java.time包。 见兄弟姐妹通过Jens Hoffman 回答 。