【问题标题】:Java program to get the current date without timestampJava程序获取没有时间戳的当前日期
【发布时间】:2011-02-17 21:07:24
【问题描述】:

我需要一个 Java 程序来获取没有时间戳的当前日期

Date d = new Date();

给我日期和时间戳。

但我只需要日期,没有时间戳。我使用此日期与另一个没有时间戳的日期对象进行比较。

打印时

System.out.println("Current Date : " + d)

它应该打印May 11 2010 - 00:00:00

【问题讨论】:

    标签: java


    【解决方案1】:

    你可以使用

    // Format a string containing a date.
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    import static java.util.Calendar.*;
    
    Calendar c = GregorianCalendar.getInstance();
    String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);
    // -> s == "Duke's Birthday: May 23, 1995"
    

    看看Formatter API documentation

    【讨论】:

    • 我不会像你提到的那样传递任何日期。
    • 更新了代码以通过 GregorianCalendar.getInstance() 返回当前日期。
    • 为什么要明确使用GregorianCalendar - 为什么不直接使用Calendar.getInstance()
    【解决方案2】:
      DateFormat dateFormat = new SimpleDateFormat("MMMM dd yyyy");
      java.util.Date date = new java.util.Date();
      System.out.println("Current Date : " + dateFormat.format(date));
    

    【讨论】:

      【解决方案3】:

      java.util.Date 对象一种时间戳 - 它包含自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。所以你不能使用标准的Date 对象来只包含一天/月/年,而没有时间。

      据我所知,在标准 Java API 中仅考虑日期(而不是时间)来比较日期并没有真正简单的方法。您可以使用Calendar 类并清除小时、分钟、秒和毫秒:

      Calendar cal = Calendar.getInstance();
      cal.clear(Calendar.HOUR_OF_DAY);
      cal.clear(Calendar.AM_PM);
      cal.clear(Calendar.MINUTE);
      cal.clear(Calendar.SECOND);
      cal.clear(Calendar.MILLISECOND);
      

      对包含要与之比较的日期的另一个 Calendar 对象执行相同操作,并使用 after()before() 方法进行比较。

      正如 java.util.Calendar.clear(int field) 的 Javadoc 中所解释的:

      HOUR_OF_DAYHOURAM_PM 字段是独立处理的,并且应用了一天中时间的解析规则。清除其中一个字段不会重置此日历的小时值。使用 set(Calendar.HOUR_OF_DAY, 0) 重置小时值。

      edit - 上面的答案来自 2010 年;在 Java 8 中,java.time 包中有一个新的日期和时间 API,它比旧的 java.util.Datejava.util.Calendar 类更强大和有用。使用新的日期和时间类而不是旧的。

      【讨论】:

      • 我不知道 cal.clear(),我要窃取它并更新我的答案。
      • 如果你给我+1,你可以;-)
      • 这可行,但您必须同时清除 HOUR 和 HOUR_OF_DAY 才能获得真正的清除 - 即将时间设置为上午 12 点。
      • @WhyGeeEx (在您发表评论多年后,这可能是真的):Java 7 的文档澄清这一点是不必要的:如果 HOUR_OF_DAY 是最新的字段集,那么它优先于“ AM_PM + HOUR”。 docs.oracle.com/javase/7/docs/api/java/util/… "如果日历字段值有任何冲突,日历会优先考虑最近设置的日历字段"。然后它继续专门显示 HOUR_OF_DAY 与“AM_PM + HOUR”。
      • @ToolmakerSteve:是的,2010 年是 Java-7 之前的版本。
      【解决方案4】:

      您始终可以使用 apache commons' DateUtils 类。它有一个静态方法isSameDay(),它“检查两个日期对象是否在同一天忽略时间。”

      static boolean isSameDay(Date date1, Date date2) 
      

      【讨论】:

      • 我阅读了 isSameDay 的文档,但我不明白它是如何工作的。不使用时区如何确定日期?有时两个 Date 实例可以在同一天或不同天(午夜之前和之后),具体取决于假定的时区。它是否假定系统的默认时区?
      • 我不知道它到底是做什么的。您必须查看来源才能确定。但是,如果您查看 Date API,它似乎会根据本地时区执行所有操作。事实上,它所有与转换到其他时区相关的方法都已被弃用。所以,真的 Date 看起来它并没有真正处理时区。如果您想对时区做任何事情,请查看日历。
      • 内部日期是自“1970 年 1 月 1 日 00:00:00 GMT”以来的毫秒数。我希望日计算也采用 GMT 时间。
      • 另一方面,我看到 (new Date).toString() 使用当前设备的默认区域设置(无论如何在 Android 上)来确定时区。所以isSameDay 可能也会这样做。
      【解决方案5】:

      我认为这会奏效。使用日历操作时间字段(将它们重置为零),然后从日历中获取日期。

      Calendar c = GregorianCalendar.getInstance();
      c.clear( Calendar.HOUR_OF_DAY );
      c.clear( Calendar.MINUTE );
      c.clear( Calendar.SECOND );
      c.clear( Calendar.MILLISECOND );
      Date today = c.getTime();
      

      或者做相反的事情。将您要比较的日期放入日历并比较日历日期

      Date compareToDate;  // assume this is set before going in.
      Calendar today = GregorianCalendar.getInstance();
      Calendar compareTo = GregorianCalendar.getInstance();
      compareTo.setTime( compareToDate );
      if( today.get( Calendar.YEAR ) == compareTo.get( Calendar.YEAR ) &&
          today.get( Calendar.DAY_OF_YEAR  ) == compareTo.get( Calendar.DAY_OF_YEAR  ) ) {
        // They are the same day!
      }
      

      【讨论】:

        【解决方案6】:

        这是一种在没有额外依赖的情况下快速完成的不优雅方法。
        您可以只使用 java.sql.Date,它扩展了 java.util.Date,但为了进行比较,您必须比较字符串。

        java.sql.Date dt1 = new java.sql.Date(System.currentTimeMillis());
        String dt1Text = dt1.toString();
        System.out.println("Current Date1 : " + dt1Text);
        
        Thread.sleep(2000);
        
        java.sql.Date dt2 = new java.sql.Date(System.currentTimeMillis());
        String dt2Text = dt2.toString();
        System.out.println("Current Date2 : " + dt2Text);
        
        boolean dateResult = dt1.equals(dt2);
        System.out.println("Date comparison is " + dateResult);
        boolean stringResult = dt1Text.equals(dt2Text);
        System.out.println("String comparison is " + stringResult);
        

        输出:

        当前日期1 : 2010-05-10
        当前日期2 : 2010-05-10
        日期比较是假的
        字符串比较为真

        【讨论】:

          【解决方案7】:
          private static final DateFormat df1 = new SimpleDateFormat("yyyyMMdd"); 
              private static Date NOW = new Date();
              static {
                  try {
                      NOW = df1.parse(df1.format(new Date()));
                  } catch (ParseException e) {
                      e.printStackTrace();
                  }
              }
          

          【讨论】:

            【解决方案8】:

            我做了如下操作,效果很好:

            calendar1.set(Calendar.HOUR_OF_DAY, 0);
            calendar1.set(Calendar.AM_PM, 0);
            calendar1.set(Calendar.HOUR, 0);
            calendar1.set(Calendar.MINUTE, 0);
            calendar1.set(Calendar.SECOND, 0);
            calendar1.set(Calendar.MILLISECOND, 0);
            Date date1 = calendar1.getTime();       // Convert it to date
            

            对您要比较的其他实例执行此操作。这个逻辑对我有用;我必须比较日期是否相等,但您可以进行不同的比较(之前、之后、相等等)

            【讨论】:

              【解决方案9】:

              我做了如下,它工作:(当前日期没有时间戳)

              SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
              Date today = dateFormat.parse(dateFormat.format(new Date()));
              

              【讨论】:

              • 它也给出了时间戳和日期
              【解决方案10】:

              你可以在这个日期前得到:

              DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
              print(dateFormat.format(new Date());
              

              【讨论】:

                【解决方案11】:

                如果您真的想使用 Date 而不是 Calendar 进行比较,这是您可以使用的最短代码:

                Calendar c = Calendar.getInstance();
                Date d = new GregorianCalendar(c.get(Calendar.YEAR), 
                                               c.get(Calendar.MONTH), 
                                               c.get(Calendar.DAY_OF_MONTH)).getTime();
                

                这样可以确保小时/分钟/秒/毫秒的值是空白的。

                【讨论】:

                  【解决方案12】:

                  我一直在寻找相同的解决方案,以下对我有用。

                      Calendar calendar = Calendar.getInstance();
                      calendar.set(Calendar.HOUR_OF_DAY, 0);
                      calendar.clear(Calendar.HOUR);
                      calendar.clear(Calendar.MINUTE);
                      calendar.clear(Calendar.SECOND);
                      calendar.clear(Calendar.MILLISECOND);
                  
                      Date today = calendar.getTime();
                  

                  请注意,我在 HOUR_OF_DAY 中使用 calendar.set(Calendar.HOUR_OF_DAY, 0) 而不是使用 clear 方法,因为在 Calendar.clear 方法的 javadocs 中建议如下

                  HOUR_OF_DAY、HOUR 和 AM_PM 字段是独立处理的,并且 应用了一天中时间的解析规则。清除一个 的字段不会重置此日历的小时值。 使用 set(Calendar.HOUR_OF_DAY, 0) 重置小时值。

                  使用上面发布的解决方案,我得到的输出为

                  Wed Sep 11 00:00:00 EDT 2013
                  

                  对 HOUR_OF_DAY 使用 clear 方法在 12PM 之后执行时将小时重置为 12,或者在 12PM 之前执行时将小时重置为 00。

                  【讨论】:

                    【解决方案13】:

                    使用 DateFormat 来解决这个问题:

                    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                    DateFormat dateFormat2 = new SimpleDateFormat("MM-dd-yyyy");
                    print(dateFormat.format(new Date()); // will print like 2014-02-20
                    print(dateFormat2.format(new Date()); // will print like 02-20-2014
                    

                    【讨论】:

                    • 这是一种以您想要的格式获取日期的简单方法。
                    【解决方案14】:

                    accepted answer by Jesper 是正确的,但现在已过时。 java.util.Date 和 .Calendar 类是出了名的麻烦。避开他们。

                    java.time

                    改用 java.time 框架,内置于 Java 8 及更高版本,back-ported to Java 6 & 7further adapted to Android

                    如果您真的不关心时间和时区,请在 java.time 框架中使用LocalDate ()。

                    LocalDate localDate = LocalDate.of( 2014 , 5 , 6 );
                    

                    今天

                    时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜过后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

                    如果没有指定时区,JVM 会隐式应用其当前的默认时区。该默认值可能在运行时(!)期间change at any moment,因此您的结果可能会有所不同。最好将您想要/预期的时区明确指定为参数。如果您想使用 JVM 当前的默认时区,请致电ZoneId.systemDefault() 明确您的意图。如果关键,请与您的用户确认该区域。

                    Continent/Region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 2-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

                    ZoneId z = ZoneId.of( "America/Montreal" ) ;  
                    LocalDate today = LocalDate.now( z ) ;
                    

                    如果你想使用 JVM 当前的默认时区,请求它并作为参数传递。如果省略,代码会变得模糊,因为我们不确定您是否打算使用默认值,或者您是否像许多程序员一样没有意识到这个问题。

                    ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
                    LocalDate today = LocalDate.now( z ) ;
                    

                    时刻

                    如果您关心特定时刻、时间轴上的特定点,请不要使用LocalDate。如果您关心通过某个地区的人们使用的挂钟时间看到的日期,请不要使用LocalDate

                    请注意,如果您有任何机会需要处理其他时区或 UTC,那么这是错误的方法。天真的程序员往往认为他们不需要时区,而实际上他们确实需要。

                    字符串

                    调用toString 以生成标准ISO 8601 格式的字符串。

                    String output = localDate.toString();
                    

                    2014-05-06

                    对于其他格式,请在 Stack Overflow 中搜索 DateTimeFormatter 类。

                    乔达时间

                    虽然现在已被 java.time 取代,但您可以使用 Joda-Time 库中类似的 LocalDate 类(java.time 的灵感来源)。

                    LocalDate localDate = new LocalDate( 2014, 5, 6 );
                    

                    【讨论】:

                      【解决方案15】:

                      你也可以使用 apache commons lib DateUtils.truncate():

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

                      时间将设置为00:00:00,因此您可以使用此日期或打印格式:

                      DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                      
                      System.out.println(dateFormat.format(now);        // 2010-05-11 11:32:47
                      System.out.println(dateFormat.format(truncated);  // 2010-05-11 00:00:00
                      

                      【讨论】:

                        【解决方案16】:

                        这是我获取日期的代码:

                        Calendar c=Calendar.getInstance();
                        DateFormat dm = new SimpleDateFormat("dd/MM/yyyy");
                        java.util.Date date = new java.util.Date();
                        System.out.println("current date is :    " + dm.format(date));
                        

                        【讨论】:

                          【解决方案17】:

                          这是它的完整示例。但是您必须将 Sting 转换回 Date。

                          import java.text.ParseException;
                          import java.text.SimpleDateFormat;
                          import java.util.Date;
                          
                          //TODO OutPut should LIKE in this format MM dd yyyy HH:mm:ss.SSSSSS
                          public class TestDateExample {
                          
                              public static void main(String args[]) throws ParseException {
                                  SimpleDateFormat changeFormat = new SimpleDateFormat("MM dd yyyy HH:mm:ss.SSSSSS");
                                   Date thisDate = new Date();//changeFormat.parse("10 07 2012"); 
                                   System.out.println("Current Date : " + thisDate);
                                   changeFormat.format(thisDate); 
                                  System.out.println("----------------------------"); 
                                  System.out.println("After applying formating :");
                                  String strDateOutput = changeFormat.format(thisDate);
                                  System.out.println(strDateOutput);
                          
                              }
                          
                          }
                          

                          【讨论】:

                            猜你喜欢
                            • 2013-03-10
                            • 2010-12-31
                            • 2018-01-05
                            • 2012-07-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2016-12-31
                            • 2018-03-04
                            • 1970-01-01
                            相关资源
                            最近更新 更多