在午夜时间用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
-
使用指定的时区(或系统默认时区的
ZoneId.systemDefault()
调用atZone(zone)
以创buildZonedDateTime
对象,并根据需要对DST进行调整。ZonedDateTime zdt = midnight.atZone(ZoneId.of("America/Montreal"));
-
调用
toInstant()
将ZonedDateTime
转换为Instant
:Instant i = zdt.toInstant()
-
最后,调用
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.time
function与传统java.util
类的互操作性。
如果您能够将外部库添加到您的项目。 我会build议你试试乔达时间。 它有一个非常聪明的方式与date工作。
当前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 回答 。