在 Java 午夜时间获取今天的日期



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

  • 日期对象 d1 应为 2012 年 3 月 9 日凌晨 12:00
  • 日期
  • 对象 D2 应包含当前日期本身
不会

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

更新

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

给出当前日期和时间

    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 00:00:00 IST 2012

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
System.out.println(sdf.format(date));

这是一个基于 Java 8 的解决方案,使用新的 java.time 包(教程(。

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

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


如果您需要旧日期,即 java.util.Date

使用以下转换将您在上面创建的LocalDateTime转换为Date

LocalDateTime -> ZonedDateTime -> Instant -> Date

  1. 使用指定的时区(或系统默认时区的ZoneId.systemDefault()(调用atZone(zone)以创建ZonedDateTime对象,并根据需要进行 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());


另请参阅旧版日期-时间代码(Java™ 教程(部分,了解新java.time功能与旧版java.util类的互操作性。

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

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

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

Using org.apache.commons.lang3.time.DateUtils

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

8 中的解决方案:

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

米利斯获取UTC午夜的Java 8方法

ZonedDateTime utcTime = ZonedDateTime.now(ZoneOffset.UTC);
long todayMidnight = utcTime.toLocalDate().atStartOfDay().toEpochSecond(ZoneOffset.UTC) * 1000;
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());
}

对于当前日期和时间:

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

这将显示为:

2013-2-5下午12:40:24

定义"午夜">

"午夜"这个词很难定义。

有些人认为这是新的一天开始的那一刻。试图在软件中表示像一天中的最后一刻一样棘手的事情总是可以细分为一秒的一小部分。

我建议更好的思考方法是获得"一天中的第一个时刻"。

这支持将时间跨度定义为"半开放"的常用方法,其中开头是包容性的,而结尾是排他性的。因此,一整天从一天中的第一个时刻开始,一直持续到(但不包括(第二天的第一个时刻。一整天是这样的(注意从 3 日到 4 日的日期(:

2016-02-03T00:00:00.0-08:00[美国/Los_Angeles]/2016-02-04T00:00:00.0-08:00[美国/Los_Angeles]

乔达时间

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

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

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

如果使用 Java 8 或更高版本,最好使用 Java 中内置的 java.time 包。参见詹斯·霍夫曼的兄弟姐妹回答。

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

最新更新