Làm cách nào để lấy ngày và giờ hiện tại theo UTC hoặc GMT trong Java? – Vương Quốc Đồ Ngủ

Bạn đang xem : Làm cách nào để lấy ngày và giờ hiện tại theo UTC hoặc GMT trong Java ?

Túi hàng ngày giá cả phải chăng với giá từ 100 ~ 300k KRW với. WConcept / Keem Nayoung’s No Filter TV

Khi tôi tạo một Date, nó được khởi tạo theo thời điểm hiện tại nhưng ở múi giờ địa phương. Làm cách nào để lấy ngày và giờ hiện tại theo GMT?

  • Tôi biết những loại chủ đề này đã hoàn toàn được thảo luận, nhưng tôi thấy gói commons-lang thực sự xử lý tốt các vấn đề java phổ biến này. commons.apache.org/lang/api-2.5/org/apache/commons/lang/time Kiểm tra các gói khác nhau mà họ có.
  • Bạn muốn giờ địa phương nào và chính xác đến mức nào. Hầu hết các múi giờ được xác định liên quan đến UTC với độ lệch cố định được đo bằng giây SI, nhưng mối quan hệ của GMT dựa trên quan sát mặt trời và giây có độ dài thay đổi (một chút) phức tạp hơn. Cả hai chênh lệch nhau tới 0,9 giây.
  • 1 A Date không giữ một múi giờ, vì vậy “nhưng ở múi giờ địa phương không đúng (hoặc không chính xác nhất là). Xem Tất cả về java.util.Date.

1 2 Tiếp theo
1 2 Tiếp theo

java.util.Date không có múi giờ cụ thể, mặc dù giá trị của nó thường được cho là liên quan đến UTC. Điều gì khiến bạn nghĩ đó là giờ địa phương?

Nói chính xác: giá trị trong một java.util.Date là số mili giây kể từ kỷ nguyên Unix, xảy ra vào nửa đêm ngày 1 tháng 1 năm 1970, giờ UTC. Kỷ nguyên tương tự cũng có thể được mô tả ở các múi giờ khác, nhưng mô tả truyền thống là về UTC. Vì đó là một số mili giây kể từ một kỷ nguyên cố định, giá trị trong java.util.Date giống nhau trên khắp thế giới vào bất kỳ thời điểm cụ thể nào, bất kể múi giờ địa phương.

Tôi nghi ngờ vấn đề là bạn đang hiển thị nó qua một phiên bản của Lịch sử dụng múi giờ địa phương hoặc có thể sử dụng Date.toString() cũng sử dụng múi giờ địa phương hoặc SimpleDateFormat ví dụ, theo mặc định, cũng sử dụng múi giờ địa phương.

Nếu đây không phải là yếu tố, vui mừng đăng 1 số ít mã mẫu .
Tuy nhiên, tôi khuyên bạn nên sử dụng Joda-Time, nó cung ứng một API rõ ràng hơn nhiều .

  • 6 Sau đó, đó có thể là một vấn đề trình điều khiển. Bạn có thể cần đặt kết nối của mình thành UTC hoặc tương tự như vậy. Tôi đã gặp sự cố như thế này trước đây, nhưng sự cố không phải ở java.util.Date.
  • 13 Behrang, theo stackoverflow.com/questions/4123534/…, trình điều khiển MySQL JDBC chuyển đổi một java.util.Timestamp (hoặc là java.util.Date) đến múi giờ máy chủ.
  • 5 @ Ông. Cat: Làm thế nào bạn xác định được điều đó? Có phải bằng văn bản không System.out.println(new Date())? Nếu vậy, bạn nên biết rằng đó là toString() phương pháp đang áp dụng múi giờ ở đó … nếu không phải vậy, vui lòng cung cấp thêm chi tiết.
  • 8 @KanagaveluSugumar: toString() luôn sử dụng múi giờ mặc định. date.getTime() chắc chắn trả về mili giây kể từ kỷ nguyên Unix, theo giờ UTC. Nói điều đó là chính xác nhất Date bản thân nó hoàn toàn không có múi giờ – nó thời gian tức thì, có thể được coi là ở nhiều múi giờ. Nhưng khi bạn tạo một phiên bản, nó phụ thuộc vào múi giờ của bạn.
  • 6 @Jemenake: Trên thực tế, điều đó đã không xảy ra khi ở Greenwich là nửa đêm, vì lúc đó Vương quốc Anh đang ở UTC + 1. Chỉ là một trong những điều kỳ lạ của lịch sử. Nhưng tôi hiểu ý bạn – tốt hơn nên nói “new Date (). GetTime () trả về mili giây kể từ kỷ nguyên Unix, lúc nửa đêm đầu ngày 1 tháng 1 năm 1970, giờ UTC”. Vì vậy, UTC là một phần của việc ghim kỷ nguyên xuống một thời điểm cụ thể trong thời gian, không phải là một phần của kết quả.

tl; dr

Instant.now() // Capture the current moment in UTC. 

Tạo một chuỗi để đại diện thay mặt cho giá trị đó :

Instant.now().toString() 

năm nay – 09-13 T23 : 30 : 52.123 Z

Chi tiết

Như câu trả lời chính xác của Jon Skeet đã nêu, đối tượng java.util.Date có không có múi giờ���. Nhưng no la toString việc triển khai áp dụng múi giờ mặc định của JVM khi tạo biểu diễn Chuỗi của giá trị ngày-giờ đó. Khó hiểu với lập trình viên na ve, một Ngày hình như để có múi giờ nhưng không.

Các java.util.Date, j.u.Calendarjava.text.SimpleDateFormat các lớp đi kèm với Java nổi tiếng là rắc rối. Tránh chúng. Thay vào đó, hãy sử dụng một trong các thư viện ngày-giờ có thẩm quyền sau:

  • gói java.time. * trong Java 8
  • Joda-Time

java.time (Java 8)

Java 8 mang đến một gói java.time. * Mới tuyệt vời để sửa chữa thay thế những lớp java.util. Date / Calendar cũ .
Nhận thời hạn hiện tại theo UTC / GMT là một cách đơn thuần

Instant instant = Instant.now(); 

Cái đó Instant lớp là khối xây dựng cơ bản trong java.time, đại diện cho một thời điểm trên dòng thời gian ở UTC với độ phân giải nano giây.

Trong Java 8, khoảnh khắc hiện tại được ghi lại chỉ với độ phân giải lên đến mili giây. Java 9 mang đến một triển khai mới của Clock ghi lại khoảnh khắc hiện tại với khả năng đầy đủ nano giây của lớp này, tùy thuộc vào khả năng phần cứng xung nhịp của máy tính chủ của bạn.

It s toString phương pháp tạo biểu diễn Chuỗi giá trị của nó bằng một định dạng ISO 8601 cụ thể. Định dạng đó xuất ra các chữ số không, ba, sáu hoặc chín chữ số (mili giây, micro giây hoặc nano giây) nếu cần để biểu thị phần giây.

Nếu bạn muốn định dạng linh hoạt hơn hoặc các tính năng bổ sung khác, thì hãy áp dụng độ lệch từ UTC bằng 0, cho chính UTC (ZoneOffset.UTC hằng số) để có được một OffsetDateTime.

OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC ); 

Đổ vào bảng tinh chỉnh và điều khiển

System.out.println( 'now.toString(): ' + now ); 

Khi chạy

now.toString(): 2014-01-21T23:42:03.522Z 

Trong khoảng java.time

Các java.time khung được xây dựng trong Java 8 trở lên. Các lớp này thay thế các lớp ngày-giờ kế thừa cũ rắc rối như java.util.Date, Calendar, & SimpleDateFormat.

Để khám phá thêm, hãy xem Hướng dẫn Oracle. Và tìm kiếm Stack Overflow để có nhiều ví dụ và lý giải. Đặc điểm kỹ thuật là JSR 310 .
Các Joda-Time, hiện đang ở chính sách bảo dưỡng, khuyên bạn nên vận động và di chuyển sang những lớp java.time .

Bạn có thể trao đổi java.time đối tượng trực tiếp với cơ sở dữ liệu của bạn. Sử dụng trình điều khiển JDBC tương thích với JDBC 4.2 trở lên. Không cần dây, không cần java.sql.* các lớp học.

Lấy những lớp java.time ở đâu ?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11và sau này – Một phần của API Java tiêu chuẩn với một triển khai đóng gói.
    • Java 9 bổ sung một số tính năng nhỏ và các bản sửa lỗi.
  • Java SE 6Java SE 7
    • Hầu hết các java.time chức năng được chuyển ngược sang Java 6 & 7 trong ThreeTen-Backport.
  • Android
    • Các phiên bản triển khai gói Android mới hơn của java.time các lớp học.
    • Đối với Android cũ hơn (<26), ThreeTenABP điều chỉnh dự án ThreeTen-Backport (đã đề cập ở trên). Xem Cách sử dụng ThreeTenABP .

Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là cơ sở chứng minh cho những bổ sung có thể có trong tương lai cho java.time. Bạn có thể tìm thấy một số lớp học hữu ích ở đây như Interval, YearWeek, YearQuarter, và nhiều hơn nữa.

Joda-Time

CẬP NHẬT : Dự án Joda-Time, hiện đang ở chính sách bảo dưỡng, khuyên bạn nên chuyển sang những lớp java.time .
Sử dụng thư viện không tính tiền mã nguồn mở của bên thứ ba Joda-Time, bạn hoàn toàn có thể lấy ngày-giờ hiện tại chỉ trong một dòng mã .
Joda-Time đã truyền cảm hứng cho những lớp java.time. * Mới trong Java 8, nhưng có một kiến ​ ​ trúc khác. Bạn hoàn toàn có thể sử dụng Joda-Time trong những phiên bản Java cũ hơn. Joda-Time liên tục hoạt động giải trí trong Java 8 và liên tục được bảo dưỡng tích cực ( tính đến năm năm trước ). Tuy nhiên, nhóm Joda-Time khuyên bạn nên chuyển sang java.time .

System.out.println( 'UTC/GMT date-time in ISO 8601 format: ' + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) ); 

Mã ví dụ chi tiết cụ thể hơn ( Joda-Time 2.3 )

org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone. org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC ); 

Đổ vào bảng tinh chỉnh và điều khiển

System.out.println( 'Local time in ISO 8601 format: ' + now ); System.out.println( 'Same moment in UTC (Zulu): ' + zulu ); 

Khi chạy

Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00 Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z 

Để biết thêm mã ví dụ về hoạt động giải trí của múi giờ, hãy xem câu vấn đáp của tôi cho một câu hỏi tựa như .

Múi giờ

Tôi khuyên bạn nên luôn chỉ định múi giờ thay vì dựa trọn vẹn vào múi giờ mặc định hiện tại của JVM ( hoàn toàn có thể biến hóa bất kể khi nào ! ). Sự phụ thuộc vào như vậy có vẻ như là nguyên do thông dụng của sự nhầm lẫn và lỗi trong việc làm hẹn giờ .

Khi gọi now() vượt qua múi giờ mong muốn / dự kiến ​​sẽ được chỉ định. Sử dụng DateTimeZone lớp học.

DateTimeZone zoneMontr��al = DateTimeZone.forID( 'America/Montreal' ); DateTime now = DateTime.now( zoneMontr��al ); 

Lớp đó giữ một hằng số cho múi giờ UTC .

DateTime now = DateTime.now( DateTimeZone.UTC ); 

Nếu bạn thực sự muốn sử dụng múi giờ mặc định hiện tại của JVM, hãy thực thi một cuộc gọi rõ ràng để mã của bạn tự ghi lại .

DateTimeZone zoneDefault = DateTimeZone.getDefault(); 

ISO 8601

Đọc về những định dạng ISO 8601. Cả java.time và Joda-Time đều sử dụng những định dạng hài hòa và hợp lý tiêu chuẩn đó làm định dạng mặc định cho cả nghiên cứu và phân tích cú pháp và tạo chuỗi .

��� Trên thực tế, java.util.Date làm có múi giờ, được chôn sâu dưới các lớp mã nguồn. Đối với hầu hết các mục đích thực tế, múi giờ đó bị bỏ qua. Vì vậy, viết tắt, chúng tôi nói java.util.Date không có múi giờ. Hơn nữa, múi giờ bị chôn vùi đó là không phải cái được sử dụng bởi Date s toString phương pháp; phương pháp đó sử dụng múi giờ mặc định hiện tại của JVM s. Tất cả lý do nữa để tránh lớp khó hiểu này và gắn bó với Joda-Time và java.time.

  • 3 DateTime.now().toDateTime(DateTimeZone.UTC) là những gì tôi đang tìm kiếm! Cảm ơn!
  • 2 @Managarm Bạn có thể rút ngắn nó thành: DateTime nowUtc = DateTime.now ( DateTimeZone.UTC ) ;
  • Làm thế nào để có được điều này với Pure Java 8 2014-01-21T15:34:29.933-08:00 trong ví dụ bạn đã sử dụng new org.joda.time.DateTime()
  • 1 @ GOXR3PLUS ZonedDateTime.now( ZoneId.of( 'America/Los_Angeles' ) ).truncatedTo( ChronoUnit.MILLIS ).toOffsetDateTime().toString() Chúng tôi nhận được thời điểm hiện tại cho một múi giờ cụ thể. Tiếp theo, loại bỏ mọi micro / nano. Sau đó, chúng tôi chuyển đổi thành chỉ có một khoảng thời gian chênh lệch so với UTC (số giờ-phút-giây) chứ không phải là một múi giờ toàn diện (lịch sử của những thay đổi trong quá khứ, hiện tại và tương lai về mức chênh lệch được sử dụng bởi những người vùng cụ thể). Cuối cùng, chúng tôi tạo văn bản đại diện cho giá trị trong đó OffsetDateTime theo định dạng ISO 8601 tiêu chuẩn được sử dụng theo mặc định trong toString phương pháp.
  • Cảm ơn bạn đã đưa ra lời giải thích chi tiết này, cũng +1 cho các hỗ trợ Android ? @BasilBourque
SimpleDateFormat dateFormatGmt = new SimpleDateFormat('yyyy-MMM-dd HH:mm:ss'); dateFormatGmt.setTimeZone(TimeZone.getTimeZone('GMT')); //Local time zone SimpleDateFormat dateFormatLocal = new SimpleDateFormat('yyyy-MMM-dd HH:mm:ss'); //Time in GMT return dateFormatLocal.parse( dateFormatGmt.format(new Date()) ); 
  • 11 Tại sao bạn phân tích cú pháp với dateFormatLocal sau khi sử dụng định dạng dateFormatGmt … không có ý nghĩa bằng cách đọc nó. Tôi chắc chắn nó hoạt động, nhưng chỉ tự hỏi?
  • 2 setTimeZone đã làm được điều đó (Tôi đoán bạn cũng có thể sử dụng getTimeZone (“UTC”) giống như GMT?)
  • 6 nhưng thời gian phụ thuộc vào thời gian đặt thiết bị. Nếu người dùng đã đặt sai thời gian trên thiết bị của họ thì bạn sẽ nhận được UTC sai. Hãy sửa cho tôi nếu sai
  • @BasavarajHampali nhưng trong thế giới ngày nay, hầu hết các thiết bị đều được kết nối với Internet để điều chỉnh thời gian không chính xác
  • 3 Không có chênh lệch múi giờ giữa Giờ phối hợp quốc tế (UTC) và Giờ trung bình Greenwich (GMT)

Điều này chắc như đinh trả về thời hạn UTC : dưới dạng những đối tượng người tiêu dùng Chuỗi và Ngày !

static final String DATE_FORMAT = 'yyyy-MM-dd HH:mm:ss'; public static Date getUTCdatetimeAsDate() { // note: doesn't check for null return stringDateToDate(getUTCdatetimeAsString()); } public static String getUTCdatetimeAsString() { final SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); sdf.setTimeZone(TimeZone.getTimeZone('UTC')); final String utcTime = sdf.format(new Date()); return utcTime; } public static Date stringDateToDate(String StrDate) { Date dateToReturn = null; SimpleDateFormat dateFormat = new SimpleDateFormat(DATEFORMAT); try { dateToReturn = (Date)dateFormat.parse(StrDate); } catch (ParseException e) { e.printStackTrace(); } return dateToReturn; } 
  • Trong câu trả lời của mình, tôi đã quên hiển thị cách DATEFORMAT được định nghĩa: static final String DATEFORMAT = 'yyyy-MM-dd HH:mm:ss';
  • 21 Hãy tránh bắt đầu tên phương thức bằng chữ hoa trong Java. Xem các quy ước mã hóa Java cho tên phương thức.
  • 2 Khi tôi được chuyển hướng đến câu trả lời này, Đang gọi new Date() sẽ không bao giờ trả về thời gian UTC chính xác, nếu thời gian của thiết bị bị sai.
  • phương pháp này có thời gian phụ thuộc vào lịch thiết bị không?
  • Một điều cần lưu ý. Bất kỳ giải pháp nào cần lấy Ngày tháng hoặc Dấu thời gian trong UTC, có vẻ như chìa khóa là không sử dụng lại SimpleDateFormat, mà sử dụng một giải pháp để lấy UTC thành một chuỗi, sau đó tạo một UTC khác khi chuyển đổi chuỗi thành Ngày hoặc Đối tượng Dấu thời gian. Tôi nhận thấy rằng nếu bạn cố gắng sử dụng lại cùng một SimpleDateFormat thì Đối tượng ngày / dấu thời gian kết quả sẽ hoàn nguyên về múi giờ địa phương thay vì UTC.
 Calendar c = Calendar.getInstance(); System.out.println('current: '+c.getTime()); TimeZone z = c.getTimeZone(); int offset = z.getRawOffset(); if(z.inDaylightTime(new Date())){ offset = offset + z.getDSTSavings(); } int offsetHrs = offset / 1000 / 60 / 60; int offsetMins = offset / 1000 / 60 % 60; System.out.println('offset: ' + offsetHrs); System.out.println('offset: ' + offsetMins); c.add(Calendar.HOUR_OF_DAY, (-offsetHrs)); c.add(Calendar.MINUTE, (-offsetMins)); System.out.println('GMT Time: '+c.getTime()); 

    Trên thực tiễn không phải thời hạn, nhưng đại diện thay mặt của nó hoàn toàn có thể được biến hóa .

    SimpleDateFormat f = new SimpleDateFormat('yyyy-MMM-dd HH:mm:ss'); f.setTimeZone(TimeZone.getTimeZone('UTC')); System.out.println(f.format(new Date())); 

    Thời gian giống nhau ở bất kể điểm nào trên Trái đất, nhưng nhận thức của tất cả chúng ta về thời hạn hoàn toàn có thể khác nhau tùy thuộc vào vị trí .

    • Đúng, giải pháp tốt và sạch sẽ. Nó chỉ làm tôi lo lắng, nếu nó không hiệu quả để tạo một đối tượng Ngày mới thay vì chỉ nhận cá thể Lịch?
    • Nó sẽ được tối ưu hóa bởi JVM và HotSpot sẽ thực thi mã x86 hiệu quả nhất có thể

    Lịch aGMTCalendar = Calendar. getInstance ( TimeZone. getTimeZone ( “ GMT ” ) ) ; Sau đó, toàn bộ những hoạt động giải trí được triển khai bằng đối tượng người tiêu dùng aGMTCalendar sẽ được thực thi với múi giờ GMT và sẽ không vận dụng thời hạn tiết kiệm chi phí ánh sáng ban ngày hoặc những khoảng chừng chênh lệch cố định và thắt chặt

    Sai lầm !

    Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone('GMT')); aGMTCalendar.getTime(); //or getTimeInMillis() 

    Calendar aNotGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone('GMT-2'));aNotGMTCalendar.getTime(); 

    sẽ trở lại cùng một thời điểm. Idem cho

    new Date(); //it's not GMT. 

      Mã này in thời hạn hiện tại UTC .

      import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; public class Test { public static void main(final String&lsqb&rsqb args) throws ParseException { final SimpleDateFormat f = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss z'); f.setTimeZone(TimeZone.getTimeZone('UTC')); System.out.println(f.format(new Date())); } } 

      Kết quả

      2013-10-26 14:37:48 UTC 

        Điều này hoạt động giải trí để nhận được mili giây UTC trong Android .

        Calendar c = Calendar.getInstance(); int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET); Long utcMilliseconds = c.getTimeInMillis() + utcOffset; 
        • 7 chỉ cần bạn trừ đi phần bù?
        • c.add(Calendar.MILLISECOND, (-utcOffset)) để tải Lịch với múi giờ utc

        Đây là điều có vẻ như không đúng mực trong câu vấn đáp của Jon Skeet. Anh ấy nói :

        java.util.Date luôn ở UTC. Điều gì khiến bạn nghĩ đó là giờ địa phương? Tôi nghi ngờ vấn đề là bạn đang hiển thị nó qua một phiên bản của Lịch sử dụng múi giờ địa phương hoặc có thể sử dụng Date.toString() cũng sử dụng múi giờ địa phương.

        Tuy nhiên, mã :

        System.out.println(new java.util.Date().getHours() + ' hours'); 

        cung cấp giờ địa phương, không phải GMT (giờ UTC), sử dụng Calendar và không SimpleDateFormat ở tất cả.

        Đó là nguyên do tại sao có vẻ như gì đó là không đúng mực .
        Tập hợp những câu vấn đáp lại với nhau, mã :

        System.out.println(Calendar.getInstance(TimeZone.getTimeZone('GMT')) .get(Calendar.HOUR_OF_DAY) + ' Hours'); 

        hiển thị giờ GMT thay vì giờ địa phương – lưu ý rằng getTime.getHours() bị thiếu bởi vì điều đó sẽ tạo ra một Date() đối tượng, về mặt lý thuyết lưu trữ ngày theo GMT, nhưng trả lại giờ trong múi giờ địa phương.

        • 7 Tôi chưa thấy câu trả lời này trước đây, nhưng nếu bạn đọc tài liệu về câu trả lời không được dùng nữa Date.getHours(), nó làm cho nó rất rõ ràng: “Giá trị trả về là một số (0 đến 23) đại diện cho giờ trong ngày có chứa hoặc bắt đầu bằng thời gian tức thì được đại diện bởi đối tượng Ngày này, như được diễn giải theo múi giờ địa phương. “(Tôi nhấn mạnh.) Đó là getHours() phương thức diễn giải giá trị trong múi giờ địa phương – nó không phải là một phần của trạng thái Date đối tượng chính nó.
        • 2 Như Jon Skeet đã tuyên bố chính xác, một đối tượng java.util.Date không có múi giờ. Nhưng thật khó hiểu, các phương pháp toStringgetHours áp dụng múi giờ mặc định cho đầu ra của chúng. Vì vậy, các lập trình viên ngây thơ rất dễ bị lừa vì nó Ngày có múi giờ nhưng trên thực tế thì không.

        Bạn hoàn toàn có thể dùng :

        Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone('GMT')); 

        Sau đó, tổng thể những hoạt động giải trí được thực thi bằng đối tượng người tiêu dùng aGMTCalendar sẽ được thực thi với múi giờ GMT và sẽ không vận dụng thời hạn tiết kiệm ngân sách và chi phí ánh sáng ban ngày hoặc những khoảng chừng chênh lệch cố định và thắt chặt. Tôi nghĩ rằng người đăng trước đó là đúng mực rằng đối tượng người dùng Date ( ) luôn trả về GMT, không phải cho đến khi bạn làm gì đó với đối tượng người tiêu dùng ngày thì nó mới được quy đổi thành múi giờ địa phương .

          Nếu bạn muốn một đối tượng người tiêu dùng Ngày với những trường được kiểm soát và điều chỉnh cho UTC, bạn hoàn toàn có thể làm như thế này với Joda Time :

          import org.joda.time.DateTimeZone; import java.util.Date; ... Date local = new Date(); System.out.println('Local: ' + local); DateTimeZone zone = DateTimeZone.getDefault(); long utc = zone.convertLocalToUTC(local.getTime(), false); System.out.println('UTC: ' + new Date(utc)); 
          • 1 Bạn đang làm việc quá chăm chỉ. Joda-Time có thể thực hiện điều này trong một dòng mã. Xem câu trả lời của riêng tôi về câu hỏi này. Gọi .toDateTime và chuyển hằng số cho múi giờ UTC.
          • 1 DateTime utcDate = new DateTime (). ToDateTime (DateTimeZone.UTC)
          SimpleDateFormat dateFormatGmt = new SimpleDateFormat('yyyy-MM-dd'); dateFormatGmt.setTimeZone(TimeZone.getTimeZone('GMT')); System.out.println(dateFormatGmt.format(date)); 
          • Vui lòng thêm một số giải thích cho câu trả lời của bạn, nó khác với rất nhiều câu trả lời khác như thế nào?
          • phương pháp này có thời gian phụ thuộc vào lịch thiết bị không?

          Đây là cách tiến hành toUTC của tôi :

           public static Date toUTC(Date date){ long datems = date.getTime(); long timezoneoffset = TimeZone.getDefault().getOffset(datems); datems -= timezoneoffset; return new Date(datems); } 

          Có thể có 1 số ít cách để cải tổ nó, nhưng nó tương thích với tôi .

            Bạn hoàn toàn có thể trực tiếp sử dụng cái này

            SimpleDateFormat dateFormatGmt = new SimpleDateFormat('dd:MM:yyyy HH:mm:ss'); dateFormatGmt.setTimeZone(TimeZone.getTimeZone('GMT')); System.out.println(dateFormatGmt.format(new Date())+''); 

              Với :

              Calendar cal = Calendar.getInstance(); 

              Sau đó cal có ngày và giờ hiện tại.
              Bạn cũng có thể lấy Ngày và Giờ hiện tại cho múi giờ với:

              Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone('GMT-2')); 

              Bạn có thể hỏi cal.get(Calendar.DATE); hoặc hằng số Lịch khác về các chi tiết khác.
              Ngày và Dấu thời gian không được chấp nhận trong Java. Lịch lớp nó không.

              • 6 Một số phương thức và hàm tạo của Date và Timestamp không được dùng nữa, nhưng bản thân các lớp thì không.

              Đây là một gợi ý khác để lấy đối tượng người dùng Dấu thời hạn GMT :

              import java.sql.Timestamp; import java.util.Calendar; ... private static Timestamp getGMT() { Calendar cal = Calendar.getInstance(); return new Timestamp(cal.getTimeInMillis() -cal.get(Calendar.ZONE_OFFSET) -cal.get(Calendar.DST_OFFSET)); } 

                Đây là một cách khác để tính giờ GMT ở định dạng Chuỗi

                String DATE_FORMAT = 'EEE, dd MMM yyyy HH:mm:ss z' ; final SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); sdf.setTimeZone(TimeZone.getTimeZone('GMT')); String dateTimeString = sdf.format(new Date()); 

                  Mã mẫu để hiển thị thời hạn mạng lưới hệ thống trong một múi giờ đơn cử và một định dạng đơn cử .

                  import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; public class TimZoneTest { public static void main (String&lsqb&rsqb args){ //: // Any screw up in this format, timezone defaults to GMT QUIETLY. So test your format a few times. System.out.println(my_time_in('GMT-5:00', 'MM/dd/yyyy HH:mm:ss') ); System.out.println(my_time_in('GMT+5:30', ''at' HH:mm a z 'on' MM/dd/yyyy')); System.out.println('---------------------------------------------'); // Alternate format System.out.println(my_time_in('America/Los_Angeles', ''at' HH:mm a z 'on' MM/dd/yyyy') ); System.out.println(my_time_in('America/Buenos_Aires', ''at' HH:mm a z 'on' MM/dd/yyyy') ); } public static String my_time_in(String target_time_zone, String format){ TimeZone tz = TimeZone.getTimeZone(target_time_zone); Date date = Calendar.getInstance().getTime(); SimpleDateFormat date_format_gmt = new SimpleDateFormat(format); date_format_gmt.setTimeZone(tz); return date_format_gmt.format(date); } } 

                  Đầu ra

                  10/08/2011 21:07:21 at 07:37 AM GMT+05:30 on 10/09/2011 at 19:07 PM PDT on 10/08/2011 at 23:07 PM ART on 10/08/2011 

                    Chỉ để làm cho việc này đơn giản hơn, để tạo Date trong UTC bạn có thể dùng Calendar :

                    Calendar.getInstance(TimeZone.getTimeZone('UTC')); 

                    Cái nào sẽ tạo một phiên bản mới cho Calendar sử dụng “UTC” TimeZone.

                    Nếu bạn cần một Date đối tượng từ lịch đó mà bạn có thể sử dụng getTime().

                    • 5 Gọi getTime () trên điều này làm cho nó mất thông tin múi giờ và trả về giờ địa phương.

                    Chuyển đổi DateTime hiện tại sang UTC:

                    DateTimeFormatter formatter = DateTimeFormat.forPattern('yyyy-MM-dd'T'HH:mm:ss.SSS'Z''); DateTimeZone dateTimeZone = DateTimeZone.getDefault(); //Default Time Zone DateTime currDateTime = new DateTime(); //Current DateTime long utcTime = dateTimeZone.convertLocalToUTC(currDateTime .getMillis(), false); String currTime = formatter.print(utcTime); //UTC time converted to string from long in format of formatter currDateTime = formatter.parseDateTime(currTime); //Converted to DateTime in UTC 
                    • 1 Bạn đang làm quá nhiều việc ở đây. (a) Mẫu định dạng mà bạn xác định đã được tích hợp sẵn trong DateTime theo mặc định; chỉ cần gọi toString trên DateTime để có được mẫu chuỗi ISO 8601 đó. (b) Quá nhiều mã để chuyển đổi giữa các múi giờ. Chỉ cần gọi “toDateTime” và chuyển một đối tượng múi giờ. Như thế này: myDateTime.toDateTime( DateTimeZone.UTC ). Đối với một múi giờ cụ thể, khởi tạo và chuyển đối tượng múi giờ dựa trên tên riêng, hãy gọi myDateTime.toDateTime( DateTimeZone.forID( 'Asia/Tehran' ) ).

                    Điều này đã thao tác cho tôi, trả về dấu thời hạn theo GMT !

                     Date currDate; SimpleDateFormat dateFormatGmt = new SimpleDateFormat('yyyy-MMM-dd HH:mm:ss'); dateFormatGmt.setTimeZone(TimeZone.getTimeZone('GMT')); SimpleDateFormat dateFormatLocal = new SimpleDateFormat('yyyy-MMM-dd HH:mm:ss'); long currTime = 0; try { currDate = dateFormatLocal.parse( dateFormatGmt.format(new Date()) ); currTime = currDate.getTime(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

                      Sử dụng Lớp học này để nhận được Giờ UTC tương thích từ Máy chủ NTP Trực tuyến :

                      import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; class NTP_UTC_Time { private static final String TAG = 'SntpClient'; private static final int RECEIVE_TIME_OFFSET = 32; private static final int TRANSMIT_TIME_OFFSET = 40; private static final int NTP_PACKET_SIZE = 48; private static final int NTP_PORT = 123; private static final int NTP_MODE_CLIENT = 3; private static final int NTP_VERSION = 3; // Number of seconds between Jan 1, 1900 and Jan 1, 1970 // 70 years plus 17 leap days private static final long OFFSET_1900_TO_1970 = ((365L * 70L) + 17L) * 24L * 60L * 60L; private long mNtpTime; public boolean requestTime(String host, int timeout) { try  DatagramSocket socket = new DatagramSocket(); socket.setSoTimeout(timeout); InetAddress address = InetAddress.getByName(host); byte&lsqb&rsqb buffer = new byte&lsqbNTP_PACKET_SIZE&rsqb DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, NTP_PORT); buffer&lsqb0&rsqb = NTP_MODE_CLIENT  catch (Exception e) { // if (Config.LOGD) Log.d(TAG, 'request time failed: ' + e); return false; } return true; } public long getNtpTime() { return mNtpTime; } /** * Reads an unsigned 32 bit big endian number from the given offset in the buffer. */ private long read32(byte&lsqb&rsqb buffer, int offset) { byte b0 = buffer&lsqboffset&rsqb byte b1 = buffer&lsqboffset+1&rsqb byte b2 = buffer&lsqboffset+2&rsqb byte b3 = buffer&lsqboffset+3&rsqb // convert signed bytes to unsigned values int i0 = ((b0 & 0x80) == 0x80 ? (b0 & 0x7F) + 0x80 : b0); int i1 = ((b1 & 0x80) == 0x80 ? (b1 & 0x7F) + 0x80 : b1); int i2 = ((b2 & 0x80) == 0x80 ? (b2 & 0x7F) + 0x80 : b2); int i3 = ((b3 & 0x80) == 0x80 ? (b3 & 0x7F) + 0x80 : b3); return ((long)i0 << 24) + ((long)i1 << 16) + ((long)i2 << 8) + (long)i3; } /** * Reads the NTP time stamp at the given offset in the buffer and returns * it as a system time (milliseconds since January 1, 1970). */ private long readTimeStamp(byte&lsqb&rsqb buffer, int offset) { long seconds = read32(buffer, offset); long fraction = read32(buffer, offset + 4); return ((seconds - OFFSET_1900_TO_1970) * 1000) + ((fraction * 1000L) / 0x100000000L); } /** * Writes 0 as NTP starttime stamp in the buffer. --> Sau đó, NTP trả về Thời gian OFFSET kể từ năm 1900 * / private void writeTimeStamp (byte &lsqb&rsqb buffer, int offset) {int ofs = offset ++; for (int i = ofs; i 

                      Và sử dụng nó với :

                       long now = 0; NTP_UTC_Time client = new NTP_UTC_Time(); if (client.requestTime('pool.ntp.org', 2000)) { now = client.getNtpTime(); } 

                      Nếu bạn cần Giờ UTC “ ngay giờ đây ” làm hàm sử dụng DateTimeString :

                      private String get_UTC_Datetime_from_timestamp(long timeStamp){ try{ Calendar cal = Calendar.getInstance(); TimeZone tz = cal.getTimeZone(); int tzt = tz.getOffset(System.currentTimeMillis()); timeStamp -= tzt; // DateFormat sdf = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss',Locale.getDefault()); DateFormat sdf = new SimpleDateFormat(); Date netDate = (new Date(timeStamp)); return sdf.format(netDate); } catch(Exception ex){ return ''; } } 

                      và sử dụng nó với :

                      String UTC_DateTime = get_UTC_Datetime_from_timestamp(now); 
                      • Trong một dòng
                         Calendar utcTime = Calendar.getInstance().add(Calendar.MILLISECOND, -time.getTimeZone().getOffset(time.getTimeInMillis()));
                      • 1 Có, nhưng điều này gọi là Giờ thiết bị cục bộ, có thể thay đổi thủ công từ người dùng thành DateTime sai
                      public static void main(String args&lsqb&rsqb){ LocalDate date=LocalDate.now(); System.out.println('Current date = '+date); } 

                        Nói một cách đơn thuần. Một đối tượng người dùng lịch tàng trữ thông tin về múi giờ nhưng khi bạn triển khai cal. getTime ( ) thì thông tin múi giờ sẽ bị mất. Vì vậy, để quy đổi múi giờ, tôi sẽ khuyên bạn nên sử dụng những lớp DateFormat …

                          đây là cách thực thi của tôi :

                          public static String GetCurrentTimeStamp() { Calendar cal=Calendar.getInstance(); long offset = cal.getTimeZone().getOffset(System.currentTimeMillis());//if you want in UTC else remove it. return new java.sql.Timestamp(System.currentTimeMillis()+offset).toString(); } 

                            Nếu bạn muốn tránh nghiên cứu và phân tích ngày và chỉ muốn có dấu thời hạn theo GMT, bạn hoàn toàn có thể sử dụng :

                            final Date gmt = new Timestamp(System.currentTimeMillis() - Calendar.getInstance().getTimeZone() .getOffset(System.currentTimeMillis())); 
                              public class CurrentUtcDate { public static void main(String&lsqb&rsqb args) { Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat('dd-MM-yyyy HH:mm:ss'); dateFormat.setTimeZone(TimeZone.getTimeZone('UTC')); System.out.println('UTC Time is: ' + dateFormat.format(date)); } } 

                              Đầu ra :

                              UTC Time is: 22-01-2018 13:14:35 

                              Bạn hoàn toàn có thể biến hóa định dạng ngày nếu cần .

                              • 2 Xin đừng dạy những người trẻ tuổi sử dụng những thứ đã lỗi thời và khét tiếng là rắc rối SimpleDateFormat. Hôm nay chúng tôi có rất nhiều điều tốt hơn trong java.time, API ngày và giờ Java hiện đại. Ngoài ra, những gì bạn đang cung cấp mà Dan, Antonio và những người khác chưa có trong câu trả lời?
                              • 2 (a) Làm thế nào để Câu trả lời này thêm giá trị so với hàng chục Câu trả lời hiện có? (b) Các lớp rắc rối được sử dụng ở đây đã được thay thế nhiều năm trước bởi hiện đại các lớp học. Đề xuất việc sử dụng chúng vào năm 2018 là một lời khuyên tồi.

                              Nếu bạn đang sử dụng thời hạn joda và muốn thời hạn hiện tại tính bằng mili giây không có bù đắp tại địa phương của bạn bạn hoàn toàn có thể sử dụng cái này :

                              long instant = DateTimeZone.UTC.getMillisKeepLocal(DateTimeZone.getDefault(), System.currentTimeMillis()); 

                                Ngày hiện tại theo giờ UTC

                                Instant.now().toString().replaceAll('T.*', ''); 

                                  1 2 Tiếp theo
                                  Tweet
                                  Share
                                  Link
                                  Plus
                                  Send
                                  Send

                                  Pin

                                  1 2 Tiếp theo