【问题标题】:want current date and time in "dd/MM/yyyy HH:mm:ss.SS" format想要“dd/MM/yyyy HH:mm:ss.SS”格式的当前日期和时间
【发布时间】:2012-02-03 10:37:03
【问题描述】:

我正在使用以下代码以“dd/MM/yyyy HH:mm:ss.SS”格式获取日期。

    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;

    public class DateAndTime{

    public static void main(String[] args)throws Exception{

    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SS");
    String strDate = sdf.format(cal.getTime());
    System.out.println("Current date in String Format: "+strDate);

    SimpleDateFormat sdf1 = new SimpleDateFormat();
    sdf1.applyPattern("dd/MM/yyyy HH:mm:ss.SS");
    Date date = sdf1.parse(strDate);
    System.out.println("Current date in Date Format: "+date);

}
}

并且得到以下输出

    Current date in String Format: 05/01/2012 21:10:17.287
    Current date in Date Format: Thu Jan 05 21:10:17 IST 2012

请建议我应该如何以相同的字符串格式显示日期(dd/MM/yyyy HH:mm:ss.SS),即我想要以下输出:

    Current date in String Format: 05/01/2012 21:10:17.287
    Current date in Date Format: 05/01/2012 21:10:17.287

请推荐

【问题讨论】:

  • 当你 System.out.println 一个日期对象时,会调用 Date 的 toString 方法。您需要创建自己的 Date 子类并覆盖 toString 方法以按照您希望的方式输出 Date。
  • 确实不清楚你想要什么,但请理解这一点:Date.toString() 返回默认格式,对此无能为力。您必须使用SimpleDateFormat 来格式化字符串输出。
  • 你的意思是.SSS 毫秒吗? Java 不支持 1/100 秒。如果您使用.SS,它的许多行为都不会像您预期的那样。
  • 仅供参考,非常麻烦的旧日期时间类,例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat,现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle

标签: java


【解决方案1】:

您不能 - 因为您调用的是 Date.toString(),如果系统时区是默认语言环境的默认日期格式,那么它总是包含系统时区。 Date 值本身没有格式的概念。如果您想以特定方式对其进行格式化,请使用 SimpleDateFormat.format()... 使用 Date.toString() 几乎总是一个坏主意。

【讨论】:

    【解决方案2】:

    以下代码给出了预期的输出。这是你想要的吗?

    import java.util.Calendar;
    import java.util.Date;
    
    public class DateAndTime {
    
        public static void main(String[] args) throws Exception {
            Calendar cal = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SS");
            String strDate = sdf.format(cal.getTime());
            System.out.println("Current date in String Format: " + strDate);
    
            SimpleDateFormat sdf1 = new SimpleDateFormat();
            sdf1.applyPattern("dd/MM/yyyy HH:mm:ss.SS");
            Date date = sdf1.parse(strDate);
            String string=sdf1.format(date);
            System.out.println("Current date in Date Format: " + string);
    
        }
    }
    

    【讨论】:

      【解决方案3】:

      用途:

       System.out.println("Current date in Date Format: " + sdf.format(date));
      

      【讨论】:

        【解决方案4】:

        您的第一个打印行中的输出正在使用您的格式化程序。您的第二个输出(从您解析的字符串创建的日期)使用 Date#toString 输出,该格式根据其自己的规则进行格式化。也就是说,您没有使用格式化程序。

        规则与您在此处看到和描述的一致: http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#toString()

        【讨论】:

          【解决方案5】:

          简单日期格式

          sdf=new SimpleDateFormat("dd/MM/YYYY hh:mm:ss");
          String dateString=sdf.format(date);
          

          它会按照你的预期给出28/09/2013 09:57:19 的输出。

          For complete program click here

          【讨论】:

          • java.util.Date temp = new SimpleDateFormat("dd/mm/yyyy hh:mm:ss", Locale.US).parse(ackDateTimeString);终于为我工作了!
          • 仅供参考,非常麻烦的旧日期时间类,例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle
          【解决方案6】:

          tl;博士

          • 使用现代 java.time 类。
          • 切勿使用Date/Calendar/SimpleDateFormat 类。

          例子:

          ZonedDateTime                                // Represent a moment as seen in the wall-clock time used by the people of a particular region (a time zone).
          .now(                                        // Capture the current moment.
              ZoneId.of( "Africa/Tunis" )              // Always specify time zone using proper `Continent/Region` format. Never use 3-4 letter pseudo-zones such as EST, PDT, IST, etc.
          )
          .truncatedTo(                                // Lop off finer part of this value.
              ChronoUnit.MILLIS                        // Specify level of truncation via `ChronoUnit` enum object.
          )                                            // Returns another separate `ZonedDateTime` object, per immutable objects pattern, rather than alter (“mutate”) the original.
          .format(                                     // Generate a `String` object with text representing the value of our `ZonedDateTime` object.
              DateTimeFormatter.ISO_LOCAL_DATE_TIME    // This standard ISO 8601 format is close to your desired output.
          )                                            // Returns a `String`.
          .replace( "T" , " " )                        // Replace `T` in middle with a SPACE.
          

          java.time

          现代方法使用 java.time 类,这些类在几年前取代了可怕的旧日期时间类,例如 CalendarSimpleDateFormat

          想要当前日期和时间

          使用Instant 捕捉UTC 中的当前时刻。

          Instant instant = Instant.now() ;
          

          要通过特定地区(时区)的人们使用的挂钟时间的镜头查看同一时刻,请申请ZoneId 以获取ZonedDateTime

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

          ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
          ZonedDateTime zdt = instant.atZone( z ) ;
          

          或者,作为捷径,将ZoneId 传递给ZonedDateTime.now 方法。

          ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "Pacific/Auckland" ) ) ;
          

          java.time 类使用nanoseconds 的分辨率。这意味着最多九位小数秒的小数部分。如果你只想要三个毫秒,truncate。将您想要的限制作为 ChronoUnit 枚举对象传递。

          ZonedDateTime
          .now( 
              ZoneId.of( "Pacific/Auckland" ) 
          )
          .truncatedTo(
              ChronoUnit.MILLIS
          )
          

          采用“dd/MM/yyyy HH:mm:ss.SS”格式

          我建议在生成字符串时始终包含与 UTC 的偏移量或时区,以避免歧义和误解。

          但如果您坚持,您可以在生成字符串时指定特定格式来表示您的日期时间值。内置的预定义格式化程序几乎可以满足您所需的格式,但对于您需要 SPACE 的 T

          String output = 
              zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
              .replace( "T" , " " )  
          ;
          

          sdf1.applyPattern("dd/MM/yyyy HH:mm:ss.SS");

          日期日期 = sdf1.parse(strDate);

          切勿使用旨在呈现给人类的文本来交换日期时间值。

          改为使用为此目的定义的标准格式,在 ISO 8601 中找到。

          java.time 在解析/生成字符串时默认使用这些 ISO 8601 格式。

          在交换特定时刻时,请始终包含与 UTC 或时区的偏移指示符。因此,在进行数据交换时,应避免使用上面讨论的所需格式。此外,通常最好将片刻交换为 UTC。这意味着 java.time 中的 Instant。您可以将InstantZonedDateTime 交换,有效地将时区调整为UTC,在同一时刻、时间轴上的同一点,但不同的挂钟时间。

          Instant instant = zdt.toInstant() ;
          String exchangeThisString = instant.toString() ;
          

          2018-01-23T01:23:45.123456789Z

          此 ISO 8601 格式在末尾使用 Z 来表示 UTC,发音为“Zulu”。


          关于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

          【讨论】:

            【解决方案7】:

            免责声明:这个答案支持使用 Date 类(事实上它早已过时且设计不佳,所以我宁愿完全不鼓励它)。我尝试用格式回答有关日期和时间对象的定期重复出现的问题。为此,我使用Date 类作为示例。最后处理其他类。

            你不想

            您不想要具有特定格式的Date。除了最简单的一次性程序外,其他所有程序的良好做法是让您的用户界面与您的模型和业务逻辑分开。 Date 对象的值属于您的模型,因此请保留您的 Date 并永远不要让用户直接看到它。当您坚持这一点时,Date 具有哪种格式就无关紧要了。每当用户应该看到日期时,将其格式化为String 并将字符串显示给用户。同样,如果您需要特定格式来持久化或与另一个系统交换,请为此目的将Date 格式化为字符串。如果用户需要输入日期和/或时间,请接受字符串或使用日期选择器或时间选择器。

            特殊情况:存储到 SQL 数据库中。您的数据库可能需要特定格式。不是这样。使用yourPreparedStatement.setObject(yourParamIndex, yourDateOrTimeObject),其中yourDateOrTimeObjectLocalDateInstantLocalDateTime 或来自java.time 的适当日期时间类的实例。再次不必担心该对象的格式。搜索更多详情。

            你不能

            Date 没有,因为不能有格式。这是一个时间点,不多也不少。一个值的容器。在您的代码sdf1.parse converts 中,您的字符串转换为Date 对象,即转换为一个时间点。它不会保留字符串,也不会保留字符串中的格式。

            为了结束这个故事,让我们也看看你的代码的下一行:

                System.out.println("Current date in Date Format: "+date);
            

            为了执行+ 符号所需的字符串连接,Java 需要首先将您的Date 转换为String。它通过调用Date 对象的toString 方法来实现这一点。 Date.toString 总是产生类似Thu Jan 05 21:10:17 IST 2012 的字符串。您无法更改它(Date 的子类除外,但您不希望这样)。然后将生成的字符串与字符串字面量连接,生成System.out.println打印的字符串。

            简而言之,“格式”仅适用于日期的字符串表示,而不适用于日期本身。

            Date 没有格式是不是很奇怪?

            我认为我所写的完全符合我们的预期。它与其他类型相似。想想int。相同的int 可以格式化成字符串,如53,55153.551(以点作为千位分隔符)、00053551+53 551 甚至0x0000_D12F。所有这些格式都会生成字符串,而 int 只是保持不变并且不会改变其格式。与 Date 对象完全相同:您可以将其格式化为许多不同的字符串,但 Date 本身始终保持不变。

            然后我可以有我选择的格式的 LocalDate、ZonedDateTime、Calendar、GregorianCalendar、XMLGregorianCalendar、java.sql.Date、Time 或 Timestamp 吗?

            不,您不能,原因与上述相同。没有一个提到的课程,事实上我见过的任何日期或时间课程都没有格式。您只能在日期时间对象之外的 String 中使用所需的格式。

            链接

            【讨论】:

              【解决方案8】:

              这是一个在 Java 8 中工作并使用“新”日期和时间 API LocalDateTime 的简单 sn-p:

              DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss.SS");
              LocalDateTime now = LocalDateTime.now();
              System.out.println(dtf.format(now)); 
              

              【讨论】:

                【解决方案9】:

                如果您使用的是 JAVA8 API,那么这段代码会有所帮助。

                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                String dateTimeString = LocalDateTime.now().format(formatter);
                System.out.println(dateTimeString);
                

                它将以给定的格式打印日期。

                但如果您再次创建 LocalDateTime 对象,它将在日期和时间之间打印“T”。

                LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);
                System.out.println(dateTime.toString());
                

                所以正如之前的帖子中提到的那样,表示和用法是不同的。

                最好使用“yyyy-MM-dd'T'HH:mm:ss”模式并相应地转换字符串/日期对象。

                【讨论】:

                  【解决方案10】:

                  使用

                  Date date = new Date();
                  String strDate = sdf.format(date);
                  

                  不是

                  Calendar cal = Calendar.getInstance();
                  String strDate = sdf.format(cal.getTime());
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-01-02
                    • 1970-01-01
                    • 2014-07-12
                    • 2011-12-06
                    • 1970-01-01
                    • 2023-03-15
                    相关资源
                    最近更新 更多