2017-08-24 44 views
0

字符串我有形式拆分使用正則表達式或其他優化的方式

YYYYMMDDHHMMSS 

基本上完整的日期/時間字符串的一個非常簡單的字符串。說,一個例子是

20170224134523 

以上意味着

year: 2017 
month: 02 
day:24 
hour:13 
min:45 
sec:23 

我想分割它,這樣我可以在變量(年,月,日,時,分,秒)擁有它。這是我想要的Scala。我在想我應該使用6-Tuple,而在右側我將使用正則表達式或最有效的方式。如果我想以一種簡潔的方式來做這件事,那就是我想要的。正則表達式不好。 任何人都可以幫忙嗎?

我可能希望將每個變量都作爲選項類型在6元組中,因爲否則這也會做我的理智檢查?如果有任何變量出現爲None,我想拋出一個異常

回答

1

java.text.SimpleDateFormat處理這類日期的解析好。

scala> val sdf = new SimpleDateFormat("yyyyMMddkkmmss") 
sdf: java.text.SimpleDateFormat = [email protected] 

scala> val date = sdf.parse("20170224134523") 
date: java.util.Date = Fri Feb 24 13:45:23 PST 2017 

您可以從下面的API中顯示的日期,日期,小時等成功解析日期。

scala> res0.get 
getClass getDate getDay getHours getMinutes getMonth getSeconds getTime getTimezoneOffset getYear 

此外,我建議包裝在一個Tryparse呼叫處理成功和不成功的解析。

scala> val date = Try(sdf.parse("20170224134523")) 
date: scala.util.Try[java.util.Date] = Success(Fri Feb 24 13:45:23 PST 2017) 

scala> val date = Try(sdf.parse("asdf")) 
date: scala.util.Try[java.util.Date] = Failure(java.text.ParseException: Unparseable date: "asdf") 

下面是使用較新的LocalDateTime而不是Date同樣的事情,它是不贊成的方法。

LocalDateTime.parse("20170224134523", DateTimeFormatter.ofPattern("yMMddkkmmss")) 

java.time.LocalDateTime = 2017-02-24T13:45:23 
+0

不錯,除了所有'get'方法已被棄用。有一個可以接受的選擇嗎? – jwvh

+0

Java在半日前徹底檢查了日期和時間。我認爲新的等價物將是'LocalDateTime.parse(str,DateTimeFormatter。ofPattern(「yyyyMMddHHmmss」))' –

+0

請注意,'yMMddkkmmss'似乎與預期的'DateTimeFormatter'一起使用,但不會用'SimpleDateFormat'返回所需的日期。 'SimpleDateFormat'適用於'yyyyMMddkkmmss'。 – Brian

0

使用這種可預測的格式,您可以使用子字符串函數(from,to)將它抓到日期類中。

的正則表達式來獲取部分爲羣體是:

(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})

Demo

+0

但也有可能會出現字符串亂碼。 – curiousengineer

+2

如果您可以在OP中發佈所有可能的變體,那麼我們可以想出一個處理它們的模式。 – linden2015

1

因爲它是日期字符串,所以使用專用的日期解析庫並解析爲日期時間類型可能很有意義。幸運的是,java用java.time包提供了非常好的一個。

val dateTime = LocalDateTime.parse("20170224134523", DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) 

這將產生一個LocalDateTime對象(日期和時間沒有附帶時區)。如果您需要更復雜的字符串解析,您可以使用DateTimeFormatterBuilder根據需要自定義日期格式。

+0

謝謝。如何在Try中將其封裝並返回選項(datatime)或者如果解析失敗則返回None? – curiousengineer

+0

@curiousengineer這個方法會在錯誤時拋出異常,所以你可以像普通的'Try(...)。toOption'一樣試一試。 – puhlen