10

我有一个这样的日期输入日期:{ts'2012-08-13 02:30:01'}

我相信我可以用单引号转义无效部分,但我在无效部分中有一个单引号。我该如何逃避呢?我尝试了几种模式,但它不起作用。

谢谢,

4

4 回答 4

14

根据SimpleDateFormat 的 javadocs

可以使用单引号 (') 引用文本以避免解释。"''"代表单引号

所以像这样的格式字符串:

"'{ts '''yyyy-MM-dd HH:mm:ss'''}'"

应该匹配{ts '2012-08-13 02:30:01'}

于 2012-08-13T20:38:53.427 回答
3

tl;博士

LocalDateTime.parse( 
    "{ts '2012-08-13 02:30:01'}"
    .replace( "{ts '" , "" )       // Delete prefix.
    .replace( "'}" , "" )          // Delete suffix.
    .replace( " " , "T" )          // Yields `2012-08-13T02:30:01`. In standard ISO 8601 format.
)                                  // Returns a `LocalDateTime` object.

java.time

SimpleDateFormat已过时,几年前被JSR 310 中定义的现代java.time类所取代。

java.time.DateTimeFormatter

改为使用DateTimeFormatter来定义用于解析/生成字符串的格式化模式。

该类使用一对单引号''作为单引号的转义值。否则,将使用单引号来标记要被格式化程序忽略的文本。

获取 ISO 8601 字符串的简单文本操作

但在您的情况下不需要自定义格式模式。您的内部文本几乎符合java.time默认使用的 ISO 8601 标准。只需对输入文本进行一些字符串操作。

String input = 
    "{ts '2012-08-13 02:30:01'}"
    .replace( "{ts '" , "" ) 
    .replace( "'}" , "" ) 
    .replace( " " , "T" )
;

产量2012-08-13T02:30:01

解析为LocalDateTime

然后解析为一个LocalDateTime对象。

LocalDateTime ldt = LocalDateTime.parse( input ) ;
于 2020-07-23T15:53:21.727 回答
2

您是否尝试过用另一个单引号转义单引号?否则,更好的方法可能是使用正则表达式提取相关部分(引号之间),然后才应用 SimpleDateFormat。

于 2012-08-13T20:33:58.893 回答
1

这对我有用

SimpleDateFormat("dd MMM''yy", Locale.ENGLISH)

01 Jan'20
于 2020-07-23T12:09:34.933 回答