【问题标题】:How to get today's Date?如何获得今天的日期?
【发布时间】:2011-02-18 21:28:59
【问题描述】:

换句话说,我想要提供 Joda-Time 的功能:

today = today.withTime(0, 0, 0, 0);

但没有 Joda-Time,只有 java.util.Date。

.setHours() 等方法已弃用。还有更正确的方法吗?

【问题讨论】:

标签: java date


【解决方案1】:
Date today = new Date();
today.setHours(0); //same for minutes and seconds

由于这些方法已被弃用,您可以使用Calendar

Calendar today = Calendar.getInstance();
today.set(Calendar.HOUR_OF_DAY, 0); // same for minutes and seconds

如果你最终需要一个Date 对象,只需调用today.getTime()

【讨论】:

  • @Plastic Rabbit 你的时区不好。以Calendar.getInstance(utcTimezone) 为例。
  • today.set(Calendar.HOUR_OF_DAY, 0) 会不会更好? clear 将该字段设置为 undefined,而set 将其设置为已定义的值。
  • 仅供参考,非常麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle
【解决方案2】:
Date today = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH);

DateUtils 来自 Apache Commons-Lang。注意时区!

【讨论】:

  • 抛出异常'不支持字段6 ...' :(
  • 对不起,应该是DAY_OF_MONTH,而不是DAY_OF_YEAR,答案已更正。
【解决方案3】:

还有更正确的方法吗?

是的,有。

LocalDate.now( 
    ZoneId.of( "America/Montreal" ) 
).atStartOfDay(
    ZoneId.of( "America/Montreal" )
)

java.time

Java 8 及更高版本现在内置了新的 java.time 框架。见Tutorial。受 Joda-Time 启发,由 JSR 310 定义,并由 ThreeTen-Extra 项目扩展。

示例

下面是一些示例,使用 java.time。请注意他们如何指定时区。如果省略,则为您的 JVM 当前的默认时区。该默认值可能会有所不同,甚至会在运行时随时更改,因此我建议您明确指定时区,而不是隐式依赖默认值。

这是一个仅日期的示例,没有时间和时区。

ZoneId zonedId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zonedId );
System.out.println( "today : " + today );

今天:2015-10-19

这是获取当前日期时间的示例。

ZoneId zonedId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.now( zonedId );
System.out.println( "zdt : " + zdt );

运行时:

zdt : 2015-10-19T18:07:02.910-04:00[美国/蒙特利尔]

一天的第一刻

问题要求时间设置为零的日期时间。这假设一天中的第一时刻始终是时间00:00:00.0,但情况并非总是如此。夏令时 (DST) 和其他异常可能意味着一天可能会在不同的时间开始,例如 01:00.0

幸运的是,java.time 可以确定一天中适合特定时区的第一个时刻LocalDate::atStartOfDay。让我们看看上面代码中使用名为todayLocalDate 和名为zoneIdZoneId 的一些代码。

ZonedDateTime todayStart = today.atStartOfDay( zoneId );

zdt : 2015-10-19T00:00:00-04:00[美国/蒙特利尔]

互操作性

如果您必须有一个 java.util.Date 用于尚未更新的类以使用 java.time 类型,请转换。调用java.util.Date.from( Instant instant ) 方法。

java.util.Date date = java.util.Date.from( zdt.toInstant() );

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案4】:
    DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Date date = new Date();
    System.out.println(dateFormat.format(date));
    

    找到here

    【讨论】:

      【解决方案5】:

      如果您希望当前日期为午夜(凌晨 0:00),您可以使用默认构造函数并将时间部分清零:

      Date today = new Date();
      today.setHours(0); today.setMinutes(0); today.setSeconds(0);
      

      编辑:更新为Calendar,因为这些方法已被弃用

      Calendar today = Calendar.getInstance();
      today.clear(Calendar.HOUR); today.clear(Calendar.MINUTE); today.clear(Calendar.SECOND);
      Date todayDate = today.getTime();
      

      【讨论】:

      【解决方案6】:

      使用此代码;

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

      这将显示为:

      2013 年 2 月 5 日下午 12:39:02

      【讨论】:

      • 问题不是关于String
      • @JonasByström 检查问题的主题。每当任何用户遇到同样的问题时,问题的主题都会出现在 Stack Overflow 的 Google 搜索链接中。我的回答符合问题的主题。
      【解决方案7】:

      使用此代码轻松获取日期和时间:

      package date.time;
      
      import java.text.SimpleDateFormat;    
      import java.util.Date;
      
      public class DateTime {
      
          public static void main(String[] args) {
              SimpleDateFormat dnt = new SimpleDateFormat("dd/MM/yy :: HH:mm:ss");
              Date date = new Date();
              System.out.println("Today Date & Time at Now :"+dnt.format(date));  
          } 
      }
      

      【讨论】:

      • 这个答案没有解决这个问题。问题希望将时间设置为零,午夜。此外,这个答案使用了多年前被现代 java.time 类取代的可怕的旧日期时间类。建议在 2018 年使用它们是糟糕的建议。第三个问题,这个答案忽略了时区的关键问题。
      【解决方案8】:

      以任何特定格式获取今天日期的代码

      您可以在 SimpleDateFormat 实例中定义所需的格式以获取该特定格式的日期

       DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
              Calendar cal = Calendar.getInstance();
              Date date = cal.getTime();
              String todaysdate = dateFormat.format(date);
               System.out.println("Today's date : " + todaysdate);
      

      点击以下链接查看有效的日期格式组合。

      https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

      代码:从今天的日期提前 x 天或上一个,获取过去的日期或未来的日期。

      例如:

      今天日期:2018 年 11 月 27 日

      xdayFromTodaysDate = 2 获取日期为 2018 年 11 月 29 日

      xdayFromTodaysDate = -2 获取日期为 11/25/2018

        public String getAniversaryDate(int xdayFromTodaysDate ){
      
              DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
              Calendar cal = Calendar.getInstance();
              Date date = cal.getTime();
              cal.setTime(date);
              cal.add(Calendar.DAY_OF_MONTH,xdayFromTodaysDate);
              date = cal.getTime();
              String aniversaryDate = dateFormat.format(date);
              LOGGER.info("Today's date : " + todaysdate);
                return aniversaryDate;
      
          }
      

      代码:从给定日期提前 x 天或上一个日期

        public String getAniversaryDate(String givendate, int xdayFromTodaysDate ){
      
      
              Calendar cal = Calendar.getInstance();
              DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
              try {
                  Date date = dateFormat.parse(givendate);
                  cal.setTime(date);
                  cal.add(Calendar.DAY_OF_MONTH,xdayFromTodaysDate);
                  date = cal.getTime();
                  String aniversaryDate = dateFormat.format(date);
                  LOGGER.info("aniversaryDate : " + aniversaryDate);
                  return aniversaryDate;
              } catch (ParseException e) {
                  e.printStackTrace();
                  return null;
              }
      
          }
      

      【讨论】:

      • 随着JSR 310 的采用,这些可怕的类已经过时了,在现代java.time 类中实现。建议在 2018 年使用这些遗留类是糟糕的建议。
      猜你喜欢
      • 2011-09-28
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多