2016-05-29 29 views
1

我正在使用MySQL數據庫在Java應用程序中定義我的數據。我需要的一種數據是日期/時間段。我需要在日期時間存儲添加劑數量。使用TIMESTAMP(?)獲取Java和MySQL的日期時間

我在其他方面計劃使用Java LocalDateTime和MySQL的TIMESTAMP數據類型來存儲日期/時間。我打算使用Java Timestamp函數轉換LocalDateTime

我可以在MySQL TIMESTAMP中存儲句點嗎?它如何處理「1天,3小時和6分鐘」作爲TIMESTAMP(沒有處於時代)?如果沒有,那麼使用我正在使用的Java方法會有什麼效果? TIA。

詳情編輯加入: 這是本地使用,在每個分配的一個時區。 PC上的Java應用程序將通過我的Java GUI捕獲和查看LocalDateTime,其中所需的粒度不會比分鐘更細。然後,它們以TIMESTAMP存儲在數據庫中。

對於一個班次週期中的每個班次,這些時間段將存儲在DB中的「班次模板」表中,作爲相對於模板的零點的開始和結束時間段。我將通過循環處理這些移位模板記錄,計算從給定的開始日期時間到提前幾個月的所有「Shift」記錄(以Java爲單位)。

使用示例: 此示例模板將爲8個工作日定義12個小時的班次,爲4個工作組,每個工作日爲4天,然後爲4天(模板表中有16條記錄) 。所有值都是調用者零點的增加量。每個預設模板記錄包括:

  • 加載量爲移位數
  • 時間 - 日期添加量用於換檔的開始
  • 時間 - 日期添加量用於換檔
  • 船員標識符的端對於移位

網格模板(記錄)
(時間段被示出爲DD:HH:MM)
移位01:00:00:00 - 0點12分:00,船員
移02:零點12分00秒 - 01:00:00,船員乙
移03:01:00:00 - 1點12分00秒,機組人員
...
移09 :四時00分00秒 - 4點12分00秒,船員ç
移位10:4點12分00秒 - 5時00分00秒,船員d
...(最多轉移16)

接下來是我想從上述模板記錄集中生成移位記錄,以06/01/2016 06:00爲例以開始日期時間(或零點)爲例,其中:

  • 移位數
  • 移位起始日期時間
  • 移位結束日期時間
  • 用於換檔
  • 船員標識符

移位(記錄)
(日期 - 時間顯示爲MM/DD/YYYY hh:mm)
輪班01:06/01/2016 06:00 - 06/01/2016 18:00,船員A
輪班02:06/01/2016 18:00 - 06/02/2016 06:00,船員B
班次03:06/02/2016 06:00 - 06/02/2016 18:00,船員A
...
班次09:06/05/2016 06:00 - 06/05/2016 18:00,船員C
班次10:06/05/2016 18 :00 - 06/06/2016 06:00,船員D
...
班17:06/09/2016 06:00 - 06/09/2016 18:00,船員A
班次18:06/09/2016 18:00 - 06/10/2016 06:00,船員B
...
班次25:06/13/2016 06:00 - 06/13/2016 18:00,船員C
班次26: 06/13/2016 18:00 - 06/14/2016 06:00,船員D
...

整個編輯,從「偏移」來「月經」,與一些澄清

+1

對我而言,將時間偏移量存儲爲整數似乎是最直觀的。該值將對應於分鐘數/秒/毫秒數(取決於您需要的粒度)。如果您需要以其他時間單位顯示偏移量,則轉換是簡單的算術運算。 –

+0

@MickMnemonic Java代碼將定義粒度。你將如何獲得/把Java中的整數? –

+1

在不瞭解應用程序的情況下很難回答,但通過['TimeUnit'],Java中的轉換很簡單(http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ TimeUnit.html)枚舉。 –

回答

1

「偏移」是錯誤的長期

在日期時間的工作,術語「偏移」通常是指偏移從-UTC。偏移量是UTC行前(東)或後(西)的小時,分​​鍾和秒數。時區是一組規則,用於處理對偏移量的調整以處理夏令時(DST)等異常情況。

您需要的術語是'elapsed',用於跟蹤一些啓動和停止時刻之間發生的時間量。

間隔

爲了跟蹤從一開始和停止時的原來的兩個時刻,或者(a)創建自己的間隔類存儲一對InstantZonedDateTime物體或(b)使用Interval類在ThreeTen-Extra的擴展了java.time類的項目(310是the JSR defining java.time的編號)。

時間

要跟蹤的時間沒有附加到時間軸上的跨度,使用Duration類。請參閱Oracle Tutorial on Period and Duration。持續時間跟蹤總秒數加上幾分之一秒(納秒)。

Instant start = Instant.now(); 
Thread.sleep(5000); // Milliseconds of sleep. 
Instant stop = Instant.now(); 

Duration duration = Duration.between(start , stop); 

的java.time類使用ISO 8601標準格式默認用於解析和生成字符串作爲他們的日期時間值的文本表示。一段時間內,該標準對於「1天,3小時和6分鐘」使用如P1DT3H6M這樣的格式。 P標誌着開始(期間),並且T將天與小時 - 分鐘 - 秒分開。您可以存儲這些字符串,因爲它們可以通過java.time輕鬆處理。但他們當然不會自然分類。

如果您需要對持續時間的長度進行排序或查詢,我建議您在持續時間內在數據庫中寫入一個整數以記錄總分鐘數(您聲明的粒度)。您可以撥打Duration::toMinutes()來獲得總數。

由於您關心的具體日期和特定時間跨度,您應該使用而不是正在使用Local…類型。 Local…類型特別丟失時區信息。沒有時區信息,您將無法處理夏令時(DST)和其他異常情況。如果使用Local…類型,則假定所有天都是24小時長,這在各個時區的現實生活中並非如此。而是使用Java中的ZonedDateTime類型,以及接近SQL標準的數據庫類型TIMESTAMP WITH TIME ZONE

問題的其餘部分沒有回答我,因爲你談到了「shift-template」和「zero-point」。但是我的直覺告訴我,由於沒有理解處理日期 - 時間數據的有效方法,你正在努力工作。日期時間處理棘手。我建議做更多的學習,比如搜索和閱讀「java date」相關的Stack Overflow問題。

+0

我感謝你給你這個時間,羅勒。整個過程中我已經將「抵消」重新編輯爲「期間」,並根據您所說的內容進行了一些其他說明。這是真的 - 我必須學習更多,'週期'和'持續時間'看起來像我需要關注的地方。在那之後,它只是關於如何在數據庫中存儲/檢索這些時段。 –

+0

@MarkMeyers更多關於術語......雖然'偏移'通常以一致的方式使用,但其他日期 - 時間術語不是。特別是「期限」,「期限」,「期限」和其他跨期期限條款沒有共同商定的用法。矛盾使用的一個例子:ISO 8601規範顯然稱爲「持續時間」的格式是以'P'開始的格式,我假設它來自'period'一詞。在java.time中,「Period」類爲年 - 月 - 日,而「Duration」爲幾天 - 幾分 - 秒。我曾經閱讀過試圖正式指定日期 - 時間術語,但沒有發現後續行動。 –

相關問題