【问题标题】:Get Today's date in Java at midnight time在午夜时间用 Java 获取今天的日期
【发布时间】:2012-03-09 06:02:59
【问题描述】:

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

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

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

更新

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

给出当前日期和时间

【问题讨论】:

  • 尝试了什么?它奏效了吗?如果没有,为什么不呢?
  • @pst 添加的部分是我想要的 d2。现在我需要午夜时间的 d1 对象。

标签: java date


【解决方案1】:
    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 月 9 日星期五 00:00:00 IST

【讨论】:

  • 你不应该也将毫秒设置为零吗?
  • 同时设置时区 - TimeZone tz = TimeZone.getTimeZone("UTC"); cal.setTimeZone(tz);
【解决方案2】:
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
System.out.println(sdf.format(date));

【讨论】:

  • 请将您的代码修改为System.out.println(sdf.format(date)); 这样更好..
  • 这不是问题所问的午夜。
【解决方案3】:

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

如果您可以在代码中使用 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. 使用指定的时区调用atZone(zone)(或系统默认时区为ZoneId.systemDefault())以创建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());


另请参阅部分 Legacy Date-Time Code (The Java™ Tutorials),了解新的 java.time 功能与旧版 java.util 类的互操作性。

【讨论】:

    【解决方案4】:
    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);
    

    【讨论】:

    • 这不是问题所问的午夜。
    【解决方案5】:

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

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

    【讨论】:

    • +1 推荐 Joda。它的 DateMidnight 课程应该为您完成。
    • @AshwiniRaman 不,不再是DateMidnight。 Joda-Time 中所有与“午夜”相关的类和方法都已弃用。他们是基于错误的想法。而是在DateTime 上使用withTimeAtStartOfDay 方法。
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

      Java 8 中的解决方案:

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

      【讨论】:

      • 使用 Java 8 很棒。两个建议:(1)给出明确的时区。 (2) 使用LocalDate.now(ZoneId.of("Asia/Karachi")).atStartOfDay(ZoneId.of("Asia/Karachi")) 考虑一天不是从 00:00 开始的情况(通常是在过渡到夏令时 (DST) 时)。或者使用ZonedDateTime.truncatedTo()
      【解决方案8】:

      对于当前日期和时间:

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

      这将显示为:

      2013 年 2 月 5 日下午 12:40:24

      【讨论】:

      • 这不是问题所问的午夜。
      【解决方案9】:

      这是一种以毫秒为单位获取 UTC Midnight 的 Java 8 方法

      ZonedDateTime utcTime = ZonedDateTime.now(ZoneOffset.UTC);
      long todayMidnight = utcTime.toLocalDate().atStartOfDay().toEpochSecond(ZoneOffset.UTC) * 1000;
      

      【讨论】:

      • 或更短:LocalDate.now( ZoneOffset.UTC ).atStartOfDay( ZoneOffset.UTC )
      【解决方案10】:
      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());
      }
      

      【讨论】:

        【解决方案11】:

        定义“午夜”

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

        有些人认为它是新的一天开始之前的那一刻。试图在软件中将这一点表示为一天中的最后一刻那样棘手,总是可以细分为更小的几分之一秒。

        我建议一种更好的思考方式是获得“一天的第一刻”。

        这支持将时间跨度定义为“半开放”的常用方法,其中开始是包容性的,而结束是排斥性的。因此,一整天从一天的第一刻开始,一直持续到(但不包括)下一天的第一刻。一整天会这样(注意日期是从 3 号到 4 号):

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

        乔达时间

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

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

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

        如果使用 Java 8 或更高版本,最好使用 Java 内置的 java.time 包。请参阅 Jens Hoffman 的 sibling Answer

        【讨论】:

          【解决方案12】:
          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
          

          【讨论】:

          • 这不是问题所问的午夜。
          猜你喜欢
          • 1970-01-01
          • 2012-10-19
          • 1970-01-01
          • 2011-12-03
          • 2020-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多