Tổng Hợp

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à vấn đề, vui lòng đăng một số mã mẫu.

Tuy nhiên, tôi khuyên bạn nên sử dụng Joda-Time, nó cung cấp 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 cho giá trị đó:

Instant.now().toString() 

2016-09-13T23: 30: 52.123Z

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 để thay thế các lớp java.util.Date/Calendar cũ.

Nhận thời gian hiện tại theo UTC / GMT là một cách đơn giả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 đ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.

Để tìm hiểu thêm, hãy xem Hướng dẫn Oracle. Và tìm kiếm Stack Overflow để có nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310.

Các Joda-Time , hiện đang ở chế độ bảo trì, khuyên bạn nên di chuyển sang các lớp java.time.

Xem Thêm :   Cách kiếm tiền tại nhà thu nhập cao trong năm 2021

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 các 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ế độ bảo trì, khuyên bạn nên chuyển sang các lớp java.time.

Sử dụng thư viện miễn phí mã nguồn mở của bên thứ ba Joda-Time, bạ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 các lớp java.time. * Mới trong Java 8, nhưng có một kiến ​​trúc khác. Bạn có thể sử dụng Joda-Time trong các phiên bản Java cũ hơn. Joda-Time tiếp tục hoạt động trong Java 8 và tiếp tục được bảo trì tích cực (tính đến năm 2014). 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 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 đ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 của múi giờ, hãy xem câu trả lời của tôi cho một câu hỏi tương tự.

Múi giờ

Tôi khuyên bạn nên luôn chỉ định múi giờ thay vì dựa hoàn toàn vào múi giờ mặc định hiện tại của JVM (có thể thay đổi bất kỳ lúc nào!). Sự phụ thuộc như vậy dường như là nguyên nhân phổ biến của sự nhầm lẫn và lỗi trong công việc 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 hiện 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ề các định dạng ISO 8601. Cả java.time và Joda-Time đều sử dụng các định dạng hợp lý tiêu chuẩn đó làm định dạng mặc định cho cả 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 chắn trả về thời gian UTC: dưới dạng các đối tượ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 tế không phải thời gian, nhưng đại diện của nó có thể được thay đổi.

    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 chúng ta về thời gian 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 đó, tất cả các hoạt động được thực hiện bằng đối tượng aGMTCalendar sẽ được thực hiện với múi giờ GMT và sẽ không áp dụng thời gian tiết kiệm ánh sáng ban ngày hoặc các khoảng chênh lệch cố định

    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 gian 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 để 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

        Xem Thêm :   Cách bán hàng trên Lazada hiệu quả chi tiết từ A-Z – Ý Tưởng Kinh Doanh

        Đây là điều có vẻ không chính xác trong câu trả lời 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à lý do tại sao có vẻ gì đó là không chính xác.

        Tập hợp các câu trả lời 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 có thể dùng:

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

        Sau đó, tất cả các hoạt động được thực hiện bằng đối tượng aGMTCalendar sẽ được thực hiện với múi giờ GMT và sẽ không áp dụng thời gian tiết kiệm ánh sáng ban ngày hoặc các khoảng chênh lệch cố định. Tôi nghĩ rằng người đăng trước đó là chính xác rằng đối tượ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ày thì nó mới được chuyển đổi thành múi giờ địa phương.

          Nếu bạn muốn một đối tượng Ngày với các trường được điều chỉnh cho UTC, bạ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 triển khai 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ó một số cách để cải thiện nó, nhưng nó phù hợp với tôi.

            Bạ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 Dấu thời gian 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 gian hệ thống trong một múi giờ cụ thể và một định dạng cụ thể.

                  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.

                    Xem Thêm :   Arpa Là Gì ? Thông Tin Tổng Quan Về Dự Án Arpa Những Thông Tin Về Arpa Chain Nhất Định…

                    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 đã làm việc cho tôi, trả về dấu thời gian 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 phù hợp 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&lsqb;NTP_PACKET_SIZE&rsqb;; DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, NTP_PORT); buffer&lsqb;0&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&lsqb;offset&rsqb;; byte b1 = buffer&lsqb;offset+1&rsqb;; byte b2 = buffer&lsqb;offset+2&rsqb;; byte b3 = buffer&lsqb;offset+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:

                      <?php  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 bây giờ” 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 giản. Một đối tượng lịch lưu trữ thông tin về múi giờ nhưng khi bạn thực hiện cal.getTime () thì thông tin múi giờ sẽ bị mất. Vì vậy, để chuyển đổi múi giờ, tôi sẽ khuyên bạn nên sử dụng các lớp DateFormat …

                          đây là cách thực hiện 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 phân tích ngày và chỉ muốn có dấu thời gian theo GMT, bạ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 có thể thay đổi đị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 gian joda và muốn thời gian 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 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

                                  Link

                                  Plus

                                  Send

                                  Send

                                  Pin

                                  1 2 Tiếp theo

                                  Xem thêm bài viết thuộc chuyên mục: Kiếm Tiền Online

                                  Xem thêm bài viết thuộc chuyên mục: Tổng Hợp
                                  Xem thêm :  Cách block face book trên điện thoại, máy tính đơn giản, có nên block người khác trên facebook

                                  Related Articles

                                  Back to top button