2012-03-09 100 views
46

我需要创建两个日期对象。如果当前日期和时间是2012年3月9日11:30 AM然后在午夜时间用Java获取今天的日期

  • 日期对象D1应该是2012 3月9日上午12:00
  • 日期对象D2应该包含当前日期本身

不会输入日期,它是系统日期。

更新

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

给出当前日期和时间

+6

什么都试过?它有用吗?如果不是,为什么不呢? – 2012-03-09 06:04:12

+0

@pst添加的部分是我想要的d2。现在我需要是午夜时间的d1对象。 – 2012-03-09 06:15:26

回答

48
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. 

应该是周五09年3月00:00:00 IST 2012

+9

你不应该也必须将毫秒设置为零? – 2014-05-10 19:03:48

+0

还设置时区 - TimeZone tz = TimeZone.getTimeZone(“UTC”); cal.setTimeZone(tz); – 2016-04-18 11:02:48

4

如果能够对外部库添加到项目中。我会建议你尝试乔达时间。它有一个非常聪明的方式处理日期。

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

+0

+1表示乔达。它的DateMidnight类应该为你做。 – 2012-03-09 06:45:46

+3

@AshwiniRaman不,不是'DateMidnight'。 Joda-Time的所有“午夜”相关课程和方法都已被弃用。他们是基于错误的想法。请在DateTime上使用['withTimeAtStartOfDay'](http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay--)方法。 – 2015-07-30 07:42:07

10
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); 
+0

不错的工作@ChandraSekhar:D – gumuruh 2014-07-07 07:57:54

+0

这不是问题问的午夜。 – Hugo 2016-04-21 13:38:51

1
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()); 
} 
35
Date date = new Date(); 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm"); 
System.out.println(sdf.format(date)); 
+0

请修改您的代码为'System.out.println(sdf.format(date));'那么更好.. – Raki 2013-06-27 07:29:48

+0

感谢分享 – 2015-04-01 14:45:32

+5

这不是问题的午夜。 – Hugo 2016-04-21 13:38:20

4

对于当前日期和时间:

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

这将显示为:

2013年2月5日下午十二时40分24秒

+0

问题不在午夜。 – Hugo 2016-04-21 13:38:29

1
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 
+1

这不是问题问的午夜。 – Hugo 2016-04-21 13:38:15

1

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

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

这里是一个Java 8的解决方案,使用新的java.time packageTutorial)。

如果你可以在你的代码使用Java 8个对象,使用LocalDateTime

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


如果需要旧的日期,即>ZonedDateTime - - >Instant - >Date

  1. 呼叫atZone(zone)与指定的时间

    LocalDateTimejava.util.Date

    使用这些转换转换上面创建的LocalDateTimeDate -zone(或系统默认时区的ZoneId.systemDefault())创建一个ZonedDateTime对象,根据需要对DST进行调整。

    ZonedDateTime zdt = midnight.atZone(ZoneId.of("America/Montreal")); 
    
  2. 呼叫toInstant()转换的ZonedDateTimeInstant

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

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


又见部分Legacy Date-Time Code (The Java™ Tutorials)为新java.time功能与传统java.util类的互操作性。

0

定义'午夜'

“午夜”一词很难定义。

有的认为它是新的一天开始前的那一刻。试图在软件中表现为棘手,因为一天的最后时刻总是可以细分为更小的一秒。

我建议在思考这个更好的办法是让“天的第一时刻”。

这支持定义的时间跨度为“半开”,在那里开始是包容性的,而结局是独家的常用方法。所以一整天从一天的第一个时刻开始,一直延伸到之后的第一刻,但不包括之后的第一刻。一整天想要这样(注意日期从第3天到第4天):

2016-02-03T00:00:00.0-08:00 [America/Los_Angeles]/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的sibling Answer

2

的Java 8 A液:

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

使用Java 8非常棒。两点建议:(1)给出明确的时区。 (2)使用'LocalDate.now(ZoneId.of(“Asia/Karachi”))。atStartOfDay(ZoneId.of(“Asia/Karachi”))'在当天不是从00开始的情况下考虑:00(通常在转换到夏令时(DST))。或者使用'ZonedDateTime.truncatedTo()'。 – 2018-01-20 11:59:50