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

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

Unix 時間/紀元時間:日期表示還是時間塊?

Unix 時間/紀元時間:日期表示還是時間塊?

GCT1015 2023-05-24 16:01:26
我最近接手了數據庫的一些職責,其中一個字段是“工作時間”。這在 MySQL 中表示為 VARCHAR,格式如下:'1970-01-01 00:05:46'(示例)所有條目都以 1970-01-01 hh:MM:ss 開頭并具有相同的格式。我想弄清楚這是否僅表示一天中的日期和時間,或者總花費的時間(例如完成客戶 x 的手機維修需要 2 小時 20 分鐘)。如果這代表時間量,我如何將其轉換為正常的小時/分鐘/秒單位集?
查看完整描述

4 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

我只是在這里猜測??雌饋砟目蛻舳耸盏搅四承┻M程完成所需的毫秒數。但是,您的客戶錯誤地(這是我的猜測)從中生成了一個日期。由于在 Java 內部,日期存儲為自格林威治標準時間 1970 年 1 月 1 日 00:00:00.000 以來的毫秒數。您的值“1970-01-01 00:05:46”是 5:46(5 分 46 秒),表示與任何特定日期無關的時間段或持續時間。但是錯誤地被客戶認為是 ZERRO 時間(1970 年 1 月 1 日 00:00:00.000 GMT)之后的 5:46 的日期。所以(如果我是正確的)你需要修復客戶端中的錯誤并將你的毫秒數解釋為持續時間而不是日期然后修復由錯誤邏輯產生的舊數據庫數據



查看完整回答
反對 回復 2023-05-24
?
catspeake

TA貢獻1111條經驗 獲得超0個贊

在你使用的Mysql中

Select SEC_TO_TIME(UNIX_TIMESTAMP('1970-01-01 00:05:46'));

你得到

05:46

所以工作時間是 5 分 46 秒。


查看完整回答
反對 回復 2023-05-24
?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

時刻與時間跨度

這顯然是一個不幸的設計決定,采用數據類型來表示一個時刻,時間軸上的一個特定點,(TIMESTAMP WITH TIME ZONE在標準 SQL 中)并濫用它來存儲未附加到時間軸的時間跨度。

從數據庫中檢索時刻

鑒于示例文本的格式,我懷疑數據實際上可能存儲在日期時間類型的列中。仔細檢查您關于列的陳述VARCHAR(或者如果它確實是VARCHAR,請一直閱讀到本答案的結尾)。

在內部,該數據類型可能存儲自 1970 UTC 第一時刻的紀元參考以來的毫秒數或微秒數。所以我們的目標是達到這個數字。

OffsetDateTime使用 JDBC 4.2 或更高版本的驅動程序將偽矩作為對象檢索。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

如果您只關心 while 秒并且不想忽略小數秒,請調用toEpochSecond().

long secondsSinceEpoch = odt.toEpochSecond() ;

將該計數傳遞給Duration班級。此類用于表示未附加到時間軸的時間跨度,時間范圍為小時-分鐘-秒加上小數秒。

Duration d = Duration.ofSeconds( secondsSinceEpoch ) ;

然后,您可以生成標準 ISO 8601 格式的字符串。

String output = d.toString() ;

對于 5 分 46 秒的示例,那將是:

PT5M46S

您可以查詢小時、分鐘和秒部分。

long hours = d.toHoursPart() ;long minutes = d.toMinutesPart() ;

… 等等。

如果您關心亞秒級的細節,請將您的OffsetDateTime對象轉換為更基本的類型Instant

Instant instant = odt.toInstant() ;

然后以納秒為單位提取整秒和小數秒。

long seconds = instant.getEpochSecond() ;int nanos = instant.getNano() ;

喂那些給Duration。

Duration d = Duration.ofSeconds( seconds , nanos ) ;

從數據庫中檢索文本

如果您確定您的原始值存儲為文本,那么這將是一個更棘手的設計決策。

通過將中間的 SPACE 用T.

String input = "1970-01-01 00:05:46".replace( " " , "T" ) ;

解析為 aLocalDateTime因為我們缺少時區指示符或與 UTC 的偏移量。

LocalDateTime ldt = LocalDateTime.parse( input ) ;

應用與 UTC 的偏移量以獲得OffsetDateTime.

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;

從那里,繼續如上所述。


查看完整回答
反對 回復 2023-05-24
?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

如果這代表時間量,我如何將其轉換為正常的小時/分鐘/秒單位集?

如果您在 Java 端而不是 MySQL 端執行此操作,您有幾個選擇。可能最簡單的方法是稍微調整字符串,使其適合輸入Duration.parse,然后使用實例上的各種訪問器Duration來獲取值。


查看完整回答
反對 回復 2023-05-24
  • 4 回答
  • 0 關注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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