亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對于給定的 Date 對象,捕獲其與 GMT 時區相關的值

對于給定的 Date 對象,捕獲其與 GMT 時區相關的值

慕桂英546537 2023-07-13 15:49:45
在 Java 8 上運行的應用程序中,我有一個 Date 對象。該對象的時區取決于客戶端的位置。在某一特定時刻,我需要將此日期轉換為 GMT,以便它可以與我從數據庫訪問的值進行比較。我嘗試了 SimpleDateFormat 和 ZonedDateTime,但有一個痛點。這些 API 為我提供了字符串值形式的 GMT 時間,這非常好。但是,一旦我解析它并將其分配給 Date 對象,它就會回到我的本地時區!例如:public class TimeZoneDemo {    public static void main(String[] args) throws ParseException {        Date istDate = Calendar.getInstance().getTime();        ZonedDateTime gmtTime = istDate.toInstant().atZone(ZoneId.of("GMT"));        System.out.println(gmtTime);        Date gmtDate = Date.from(gmtTime.toInstant());        System.out.println(gmtDate);    }}在上面的代碼中,gmtTime顯示與 GMT 時區相關的正確值,但gmtDate(Date 對象)打印本地時區的值。PS:我的最終目標是在 java.sql.TimeStamp 對象中擁有 GMT 值。如何才能實現這一目標?更新 1: 查看評論和回復后,我了解到 Date 對象只保存一個包含毫秒的長值。 但是,我的期望是,當執行此行時:Date gmtDate = Date.from(gmtTime.toInstant());無論對象gmtTime包含什么時間,我都需要在 TimeStamp 或 Date 對象中捕獲該時間。動機是能夠與數據庫中保存的值進行比較。我將日期作為參數傳遞給我的 SQL 查詢。有人可以幫我理解如何實現這一點嗎?
查看完整描述

3 回答

?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

java.time 和 JDBC 4.2

使用OffsetDateTime。


? ? PreparedStatement yourPreparedStatement = yourDatabaseConnection.prepareStatement(

? ? ? ? ? ? "select smth from your_table where your_time_stamp_col < ?;");

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

? ? yourPreparedStatement.setObject(1, gmtTime);

這需要一個兼容 JDBC 4.2 的 JDBC 驅動程序,我認為現在我們所有人都在使用它。這很好,因為它允許我們繞過java.sql.Timestamp中的其他日期時間類型java.sql。它們的設計都很糟糕并且早已過時。


正如其他人所說,這兩個類都不是過時的Date,也Timestamp沒有任何時區或與 UTC/GMT 的偏移。


查看完整回答
反對 回復 2023-07-13
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

首先,Date類是舊的過時的(沒有雙關語)基礎設施的一部分。如果可能的話,擺脫它并只使用java.time包。但如果您必須使用,Date那么您的時區問題就不是問題。您的線路System.out.println(gmtDate);僅使用您的本地時區打印它,因為系統假定它是最佳選擇。但無論如何,Date自 1970 年 1 月 1 日 00:00:00 GMT 以來的特定時刻(以毫秒為單位)。類具有compareTo()、after()和before()Date方法,可讓您比較2 個日期。還有方法getTime()Date返回此日期表示的自 1970 年 1 月 1 日 00:00:00 GMT 以來的毫秒數。這樣您就可以比較這些long值。但同樣,最好的選擇是切換到java.time包和類Instant和ZonedDateTime(和其他)有方法compareTo()、isAfter() 和 isBefore()。



查看完整回答
反對 回復 2023-07-13
?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

您誤解了日期時間類的語義。java.util.Date是一個特定的時間點,一個瞬間,它沒有與之關聯的時區。但是,如果您有時區,您可以詢問時區的時間java.util.Date。

java.sql.TimeStamp相當于java.time.LocalDateTime. 它不是一個瞬間,也沒有與之關聯的時區。


查看完整回答
反對 回復 2023-07-13
  • 3 回答
  • 0 關注
  • 207 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號