【问题标题】:Need to get current timestamp in Java需要在 Java 中获取当前时间戳
【发布时间】:2012-01-10 19:33:45
【问题描述】:

我需要在Java中获取当前时间戳,格式为MM/DD/YYYY h:mm:ss AM/PM

例如:06/01/2000 10:01:50 AM

我也需要它是线程安全的。

我可以使用这样的东西吗?

java.util.Date date = new java.util.Date();
System.out.println(new Timestamp(date.getTime()));

或者链接here讨论的例子。

【问题讨论】:

  • 如果您在方法范围内创建 SimpleDateFormat,它将是线程安全的...
  • 感谢您的意见和澄清。

标签: java datetime format timestamp


【解决方案1】:

您可以使用java.util.Date 直接日期字符串格式:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

【讨论】:

    【解决方案2】:

    嗯,有时这也很有用。

    import java.util.Date;
    public class DisplayDate {
    public static void main(String args[]) {
       // Instantiate an object
       Date date = new Date();
    
       // display time and date
       System.out.println(date.toString());}}
    

    样本输出: Mon Jul 03 19:07:15 IST 2017

    【讨论】:

      【解决方案3】:

      当我想要一个时间戳时,我就是这样做的

          String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime());
      

      希望它有所帮助:) 作为一个新手,我认为这是不言自明的

      我认为你还需要 import java.text.SimpleDateFormat;标题让它工作:))

      【讨论】:

        【解决方案4】:

        java.time

        从 Java 8+ 开始,您可以使用 java.time package。具体来说,使用DateTimeFormatterBuilderDateTimeFormatter 来格式化模式和文字。

        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                .appendPattern("MM").appendLiteral("/")
                .appendPattern("dd").appendLiteral("/")
                .appendPattern("yyyy").appendLiteral(" ")
                .appendPattern("hh").appendLiteral(":")
                .appendPattern("mm").appendLiteral(":")
                .appendPattern("ss").appendLiteral(" ")
                .appendPattern("a")
                .toFormatter();
        System.out.println(LocalDateTime.now().format(formatter));
        

        输出...

        06/22/2015 11:59:14 AM
        

        或者如果你想要不同的time zone...

        // system default
        System.out.println(formatter.withZone(ZoneId.systemDefault()).format(Instant.now()));
        // Chicago
        System.out.println(formatter.withZone(ZoneId.of("America/Chicago")).format(Instant.now()));
        // Kathmandu
        System.out.println(formatter.withZone(ZoneId.of("Asia/Kathmandu")).format(Instant.now()));
        

        输出...

        06/22/2015 12:38:42 PM
        06/22/2015 02:08:42 AM
        06/22/2015 12:53:42 PM
        

        【讨论】:

        • 我们也可以使用DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a")来获取DateTimeFormatter的一个实例:)
        • 它比需要的更罗嗦。您可以只使用DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a");。或者,如果您想非常明确地表明文字是文字:DateTimeFormatter.ofPattern("MM'/'dd'/'yyyy' 'hh':'mm':'ss' 'a")- 无论您使用您的版本还是我的版本,我都认为使用 java.time 是一个好主意。
        【解决方案5】:

        使用 java.sql.Timestamp 在 java 中打印时间戳。

        import java.sql.Timestamp;
        import java.util.Date;
        
        public class GetCurrentTimeStamp {
            public static void main( String[] args ){
                java.util.Date date= new java.util.Date();
                System.out.println(new Timestamp(date.getTime()));
            }
        }
        

        打印出来:

        2014-08-07 17:34:16.664
        

        在单行上使用 SimpleDateFormat 在 Java 中打印时间戳。

        import java.util.Date;
        import java.text.SimpleDateFormat;
        
        class Runner{
            public static void main(String[] args){
        
                System.out.println(
                    new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new Date()));
        
            }
        
        }
        

        打印:

        08/14/2014 14:10:38
        

        Java 日期格式图例:

        G Era designation      Text               AD
        y Year                 Year               1996; 96
        M Month in year        Month              July; Jul; 07
        w Week in year         Number             27
        W Week in month        Number             2
        D Day in year          Number             189
        d Day in month         Number             10
        F Day of week in month Number             2
        E Day in week          Text               Tuesday; Tue
        a Am/pm marker         Text               PM
        H Hour in day (0-23)   Number             0
        k Hour in day (1-24)   Number             24
        K Hour in am/pm (0-11) Number             0
        h Hour in am/pm (1-12) Number             12
        m Minute in hour       Number             30
        s Second in minute     Number             55
        S Millisecond          Number             978
        z Time zone            General time zone  Pacific Standard Time; PST; GMT-08:00
        Z Time zone            RFC 822 time zone  -0800
        

        【讨论】:

          【解决方案6】:

          乔达时间

          这里是相同类型的代码,但使用了第三方库Joda-Time 2.3。

          在现实生活中,我会指定time zone,因为依赖默认区域通常是一种不好的做法。但为简单起见,此处省略。

          org.joda.time.DateTime now = new DateTime();
          org.joda.time.format.DateTimeFormatter formatter = DateTimeFormat.forPattern( "MM/dd/yyyy h:mm:ss a" );
          String nowAsString = formatter.print( now );
          
          System.out.println( "nowAsString: " + nowAsString );
          

          运行时……

          nowAsString: 11/28/2013 11:28:15 PM
          

          【讨论】:

            【解决方案7】:

            试试这个单行解决方案:

            import java.util.Date;
            String timestamp = 
                new java.text.SimpleDateFormat("MM/dd/yyyy h:mm:ss a").format(new Date());
            

            【讨论】:

            • 这行得通。对于现代语言来说,写超过 1 行来做这样的事情似乎很荒谬。
            • @AndrewCowenhoven 超过 1 行。 :D
            【解决方案8】:

            SimpleDateFormat 的线程不安全应该不是问题,如果您只是在使用它的相同方法块中创建它。换句话说,您将其分配为类的静态变量或实例变量,并在一个或多个可由多个线程调用的方法中重用它。只有这样SimpleDateFormat的线程不安全才会暴露。但是,您可以在同一个方法块中安全地重用相同的 SimpleDateFormat 实例,因为它只能由当前线程访问。

            此外,您在其中使用的 java.sql.Timestamp 类不应被滥用,因为它特定于 JDBC API,以便能够在 SQL 数据库中存储或检索 TIMESTAMP/DATETIME 列类型并将其从/转换为java.util.Date

            所以,应该这样做:

            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy h:mm:ss a");
            String formattedDate = sdf.format(date);
            System.out.println(formattedDate); // 12/01/2011 4:48:16 PM
            

            【讨论】:

            • 感谢您的帮助。这工作,谢谢!感谢您对 SimpleDateFormat 线程安全的详细、简洁的说明。您对 Timestamp 的看法是专门用于 SQL。这很有意义。谢谢你的智慧。
            • 只是想说您在第二行中忘记了冒号。这是一个很小的错误;它只是让复制和粘贴稍微不舒服。
            • @user:这是一个分号。我修好了。
            【解决方案9】:
            String.format("{0:dddd, MMMM d, yyyy hh:mm tt}", dt);
            

            【讨论】:

            • 感谢您的帮助。不幸的是,这没有奏效。我收到“方法格式(字符串,日期)未定义字符串类型”的错误。它需要对象类型,而不是日期类型。
            • 尝试对 String.format(...) 使用小写的“f”。 java中的方法名按约定以小写字母开头。
            • 非常感谢。我试过 String str = String.format("{0:dddd, MMMM d, yyyy hh:mm tt}", new Date()); str 取 {0:dddd, MMMM d, yyyy hh:mm tt} 的值。也就是说,它不起作用。
            【解决方案10】:

            SimpleDateFormat 不是线程安全的事实并不意味着您不能使用它。 这仅意味着您不能使用同时从多个线程访问的单个(可能但不一定是static)实例。

            相反,只需确保为每个线程创建一个新的SimpleDateFormat。在方法内创建为局部变量的实例在定义上是安全的,因为它们无法从任何并发线程访问。

            可能想看看ThreadLocal 类,尽管我建议您在需要的地方创建一个新实例。当然,您可以在某处将格式定义定义为static final String DATE_FORMAT_PATTERN = "...";,并将其用于每个新实例。

            【讨论】:

            • 我希望我也可以给你一个复选标记,因为你也应该得到一个。您对该主题的了解对于我自己和其他将阅读此问题的人来说非常宝贵。非常感谢您的时间和帮助。
            猜你喜欢
            • 2021-12-04
            • 2011-12-26
            • 1970-01-01
            • 2016-06-15
            • 2019-07-21
            • 2012-03-04
            • 2015-07-18
            • 2011-02-16
            • 1970-01-01
            相关资源
            最近更新 更多