2011-12-01 52 views
48

tôi cần để có được những dấu thời gian hiện tại trong Java, với định dạng của MM/DD/YYYY h:mm:ss AM/PM,Cần phải lấy dấu thời gian hiện tại trong Java

Ví dụ: 06/01/2000 10:01:50 AM

Tôi cần nó để được threadsafe là tốt.

Tôi có thể sử dụng thứ gì đó như thế này không?

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

Hoặc các ví dụ được thảo luận tại liên kết here.

+2

Nếu bạn tạo SimpleDateFormat trong phạm vi của một phương pháp nó sẽ được threadsafe ... – willcodejavaforfood

+0

Cảm ơn bạn đã vào và giải thích rõ ràng của bạn. – user717236

Trả lời

69

Chủ đề an toàn của SimpleDateFormat không phải là vấn đề nếu bạn chỉ cần tạo nó trong cùng một khối phương thức khi bạn sử dụng nó. Nói cách khác, bạn đang không phải là gán nó làm biến tĩnh hoặc biến mẫu của một lớp và sử dụng lại nó trong một hoặc nhiều phương thức có thể được gọi bởi nhiều luồng. Chỉ có cách này threadunsafety của SimpleDateFormat sẽ được tiếp xúc. Tuy nhiên, bạn có thể sử dụng lại một cách an toàn cùng một cá thể SimpleDateFormat trong cùng một khối phương thức vì nó sẽ chỉ được truy cập bởi luồng hiện tại.

Ngoài ra, lớp java.sql.Timestamp mà bạn đang sử dụng không nên bị lạm dụng vì nó là cụ thể cho các API JDBC để có thể lưu trữ hoặc lấy một loại cột TIMESTAMP/DATETIME trong một cơ sở dữ liệu SQL và chuyển đổi nó từ/đến java.util.Date.

Vì vậy, điều này sẽ làm:

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

Cảm ơn sự giúp đỡ của bạn. Điều này làm việc, cảm ơn bạn! Tôi đánh giá cao tài khoản chi tiết, súc tích của bạn về an toàn luồng, đối với SimpleDateFormat. Bạn đang xem trên Dấu thời gian là sử dụng nó dành riêng cho SQL. Điều đó có ý nghĩa hoàn hảo. Cảm ơn sự khôn ngoan của bạn. – user717236

+3

Bạn được chào đón. – BalusC

+1

Chỉ muốn nói rằng bạn đã quên dấu hai chấm trong dòng thứ hai của mình. Đó là một sai lầm rất nhỏ; nó chỉ làm cho việc sao chép và dán hơi khó chịu hơn một chút. – deinocheirus

5

Thực tế là SimpleDateFormat không phải là thread-safe không có nghĩa là bạn không thể sử dụng nó. Điều đó chỉ có nghĩa là bạn không được sử dụng một cá thể đơn lẻ (có khả năng, nhưng không nhất thiết phải là static) được truy cập từ nhiều luồng cùng một lúc.

Thay vào đó, chỉ cần đảm bảo bạn tạo SimpleDateFormat mới cho mỗi chuỗi. Các cá thể được tạo ra dưới dạng các biến cục bộ bên trong một phương thức được an toàn theo định nghĩa, bởi vì chúng không thể đạt được từ bất kỳ luồng đồng thời nào.

Bạn có thể muốn xem qua lớp ThreadLocal, mặc dù tôi khuyên bạn chỉ nên tạo một bản sao mới ở bất cứ đâu bạn cần. Bạn có thể, tất nhiên, có định nghĩa định dạng được định nghĩa là một static final String DATE_FORMAT_PATTERN = "..."; ở đâu đó và sử dụng định dạng đó cho từng cá thể mới.

+0

Tôi ước tôi có thể cung cấp cho bạn một dấu kiểm, là tốt, như bạn xứng đáng một, quá. Kiến thức của bạn về chủ đề này là vô giá đối với bản thân tôi và những người khác sẽ đọc câu hỏi này. Cảm ơn bạn rất nhiều vì đã dành thời gian và giúp đỡ. – user717236

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

Cảm ơn sự giúp đỡ của bạn. Thật không may, điều này đã không làm việc. Tôi đã nhận lỗi của "Định dạng phương thức (Chuỗi, Ngày) là không xác định cho loại Chuỗi". Nó mong đợi kiểu đối tượng, không phải kiểu ngày tháng. – user717236

+3

Hãy thử với "f" chữ thường cho String.format (...). Tên phương thức trong java bắt đầu bằng một chữ cái viết thường theo quy ước. –

+1

Cảm ơn bạn rất nhiều. Tôi đã thử String str = String.format ("{0: dddd, MMMM d, yyyy hh: mm tt}", ngày mới()); và str lấy giá trị {0: dddd, MMMM d, yyyy hh: mm tt}. Nghĩa là, nó không hoạt động. – user717236

7

Hãy thử giải pháp này dòng duy nhất:

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

Tính năng này hoạt động. Viết nhiều hơn 1 dòng để làm một cái gì đó như thế này có vẻ vô lý đối với một ngôn ngữ hiện đại. –

+0

@AndrewCowenhoven Nó có nhiều hơn 1 dòng. : D – Andrew

1

Joda thời gian

Đây là cùng một loại mã nhưng sử dụng thư viện của bên thứ ba Joda-Time 2.3.

Trong cuộc sống thực, tôi sẽ chỉ định một time zone, vì dựa vào vùng mặc định thường là một thực hành không tốt. Nhưng bỏ qua ở đây cho sự đơn giản của ví dụ.

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); 

Khi chạy ...

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

In một Dấu thời gian trong java, sử dụng 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())); 
    } 
} 

này in:

2014-08-07 17:34:16.664 

In một Dấu thời gian trong Java sử dụng SimpleDateFormat trên một lớp lót.

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())); 

    } 

} 

Prints:

08/14/2014 14:10:38 

Java dạng ngày huyền thoại:

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

giải thích tốt đẹp! – hnvasa

3

java.time

Tính đến Java 8 + bạn có thể sử dụng java.time package. Cụ thể, sử dụng DateTimeFormatterBuilderDateTimeFormatter để định dạng mẫu và chữ.

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)); 

Sản lượng ...

06/22/2015 11:59:14 AM 

Hoặc nếu bạn muốn khác nhau 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())); 

Sản lượng ...

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

Chúng ta cũng có thể sử dụng 'DateTimeFormatter.ofPattern (" MM/dd/yyyy hh: mm: ss a ")' để có được một thể hiện của DateTimeFormatter :) – Arkantos

1

tôi đã làm nó như thế này khi tôi muốn một tmiestamp

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

Hy vọng nó sẽ giúp :) Là một newbie Tôi nghĩ đó là tự giải thích

Tôi nghĩ bạn cũng cần java.text.SimpleDateFormat nhập khẩu; tiêu đề cho nó hoạt động :))

1

Bạn có thể tận dụng java.util.Date với định dạng trực tiếp:

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

cũng đôi khi điều này cũng rất hữu ích.

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());}} 

sản lượng mẫu:Mon Jul 03 19:07:15 IST 2017

Các vấn đề liên quan