2011-12-01 31 views
48

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

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

我需要它是线程安全的为好。

我可以使用类似的东西吗?

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

或者在链接here处讨论的例子。

+2

如果你在这将是线程安全的方法的范围之内创建的SimpleDateFormat ... – willcodejavaforfood

+0

谢谢您的输入,在清除了。 – user717236

回答

69

SimpleDateFormat的threadunsafety不应该是一个问题,如果你只是在你使用它的方法块中创建它。换句话说,您是而不是将其指定为类的静态或实例变量,并将其重用为可由多个线程调用的一个或多个方法。只有这样,SimpleDateFormat的threadunsafety将暴露。但是,您可以安全地在与当前线程仅访问它的方法块相同的方法块内重复使用相同的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 
+1

谢谢你的帮助。这工作,谢谢你!感谢您对SimpleDateFormat的详细,简洁的线程安全说明。你在Timestamp上查看是专门用于SQL的。这很有道理。谢谢你的智慧。 – user717236

+3

不客气。 – BalusC

+1

只是想说你在第二行中忘记了冒号。这是一个很小的错误;它只是使复制和粘贴稍微不舒服。 – deinocheirus

5

事实上,SimpleDateFormat是不是线程安全的,并不意味着你不能使用它。 这只意味着你不能使用一次从多个线程访问的单个(可能但不一定是static)实例。

相反,只要确保为每个线程创建新的SimpleDateFormat即可。在方法内创建为局部变量的实例根据定义是安全的,因为它们不能从任何并发线程到达。

可能想看看ThreadLocal类,虽然我会建议只是创建一个新的实例,无论你需要一个。当然,您可以将格式定义定义为static final String DATE_FORMAT_PATTERN = "...";,并将其用于每个新实例。

+0

我希望我也可以给你一个复选标记,因为你也应该得到一个复选标记。你对这个问题的了解对于我和其他将阅读这个问题的人是无价的。非常感谢您的时间和帮助。 – user717236

0
String.format("{0:dddd, MMMM d, yyyy hh:mm tt}", dt); 
+0

谢谢你的帮助。不幸的是,这不起作用。我得到了“方法格式(字符串,日期)未定义类型字符串”的错误。它期望对象类型,而不是日期类型。 – user717236

+3

尝试用String.format(...)的小写“f”。 java中的方法名称按照惯例以小写字母开头。 –

+1

非常感谢。我试过String str = String.format(“{0:dddd,MMMM d,yyyy hh:mm tt}”,new Date()); str取值为{0:dddd,MMMM d,yyyy hh:mm tt}。也就是说,它不起作用。 – user717236

7

尝试这一行的解决方案:

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

这工作。写超过1行来做类似这样的事情对于现代语言来说似乎很荒谬。 –

+0

@AndrewCowenhoven它超过1行。 :D – Andrew

1

乔达时间

这里是同一种代码,但利用第三方库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 
13

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

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 
+0

不错的解释! – hnvasa

3

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 
+0

我们也可以使用DateTimeFormatter.ofPattern(“MM/dd/yyyy hh:mm:ss a”)'来获取DateTimeFormatter的一个实例:) – Arkantos

1

我做了这样的当我想要一个tmiestamp

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

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

我想你也需要进口java.text.SimpleDateFormat的;头为它工作:))

1

您可以使用java.util.Date的直接格式:

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

以及有时这也是有用的。

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