4 回答

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

TA貢獻1111條經(jīng)驗 獲得超0個贊
在你使用的Mysql中
Select SEC_TO_TIME(UNIX_TIMESTAMP('1970-01-01 00:05:46'));
你得到
05:46
所以工作時間是 5 分 46 秒。

TA貢獻1893條經(jīng)驗 獲得超10個贊
時刻與時間跨度
這顯然是一個不幸的設(shè)計決定,采用數(shù)據(jù)類型來表示一個時刻,時間軸上的一個特定點,(TIMESTAMP WITH TIME ZONE
在標(biāo)準 SQL 中)并濫用它來存儲未附加到時間軸的時間跨度。
從數(shù)據(jù)庫中檢索時刻
鑒于示例文本的格式,我懷疑數(shù)據(jù)實際上可能存儲在日期時間類型的列中。仔細檢查您關(guān)于列的陳述VARCHAR
(或者如果它確實是VARCHAR
,請一直閱讀到本答案的結(jié)尾)。
在內(nèi)部,該數(shù)據(jù)類型可能存儲自 1970 UTC 第一時刻的紀元參考以來的毫秒數(shù)或微秒數(shù)。所以我們的目標(biāo)是達到這個數(shù)字。
OffsetDateTime
使用 JDBC 4.2 或更高版本的驅(qū)動程序?qū)尉刈鳛閷ο髾z索。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
如果您只關(guān)心 while 秒并且不想忽略小數(shù)秒,請調(diào)用toEpochSecond()
.
long secondsSinceEpoch = odt.toEpochSecond() ;
將該計數(shù)傳遞給Duration
班級。此類用于表示未附加到時間軸的時間跨度,時間范圍為小時-分鐘-秒加上小數(shù)秒。
Duration d = Duration.ofSeconds( secondsSinceEpoch ) ;
然后,您可以生成標(biāo)準 ISO 8601 格式的字符串。
String output = d.toString() ;
對于 5 分 46 秒的示例,那將是:
PT5M46S
您可以查詢小時、分鐘和秒部分。
long hours = d.toHoursPart() ;long minutes = d.toMinutesPart() ;
… 等等。
如果您關(guān)心亞秒級的細節(jié),請將您的OffsetDateTime
對象轉(zhuǎn)換為更基本的類型Instant
。
Instant instant = odt.toInstant() ;
然后以納秒為單位提取整秒和小數(shù)秒。
long seconds = instant.getEpochSecond() ;int nanos = instant.getNano() ;
喂那些給Duration
。
Duration d = Duration.ofSeconds( seconds , nanos ) ;
從數(shù)據(jù)庫中檢索文本
如果您確定您的原始值存儲為文本,那么這將是一個更棘手的設(shè)計決策。
通過將中間的 SPACE 用T
.
String input = "1970-01-01 00:05:46".replace( " " , "T" ) ;
解析為 aLocalDateTime
因為我們?nèi)鄙贂r區(qū)指示符或與 UTC 的偏移量。
LocalDateTime ldt = LocalDateTime.parse( input ) ;
應(yīng)用與 UTC 的偏移量以獲得OffsetDateTime
.
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
從那里,繼續(xù)如上所述。

TA貢獻1828條經(jīng)驗 獲得超3個贊
如果這代表時間量,我如何將其轉(zhuǎn)換為正常的小時/分鐘/秒單位集?
如果您在 Java 端而不是 MySQL 端執(zhí)行此操作,您有幾個選擇??赡茏詈唵蔚姆椒ㄊ巧晕⒄{(diào)整字符串,使其適合輸入Duration.parse
,然后使用實例上的各種訪問器Duration
來獲取值。
添加回答
舉報