Java-Spring(HSql + Rest)-POST与HSQL数据库中的日期时间格式

时间:2019-01-26 18:02:26

标签: java

我正在尝试在rest中使用内存数据库中的spring构建一个非常简约的HSQL应用程序。

我在一个实体中有一个date列。我可以通过其余端点POST条消息并填写数据库。我也可以GET封邮件。当我尝试使用搜索GETfindByDate条消息时,我没有得到任何结果。

如果我对Web服务器端点进行GET localhost:8080/weather,则会得到以下输出

{
    "_embedded": {
        "weather": [
            {
                "city": "Amsterdam",
                "date": "2019-01-30T00:00:00.000+0000",
                "unit": "celcius",
                "lowTemp": "-5",
                "highTemp": "3",
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/weather/1"
                    },
                    "weather": {
                        "href": "http://localhost:8080/weather/1"
                    }
                }
            }
        ]
    },
    "_links": {
        "self": {
            "href": "http://localhost:8080/weather{?page,size,sort}",
            "templated": true
        },
        "profile": {
            "href": "http://localhost:8080/profile/weather"
        },
        "search": {
            "href": "http://localhost:8080/weather/search"
        }
    },
    "page": {
        "size": 20,
        "totalElements": 1,
        "totalPages": 1,
        "number": 0
    }
}

但是当我去GET localhost:8080/weather/search/findByDate?date=2019-01-30T00:00:00.000+0000时,我得到了无法解析的日期错误。

我在GET请求中尝试了许多不同的日期时间格式。什么都没用。

2019-01-30T00:00:00.000+0000
2019-01-30'T'00:00:00.000+0000

有人可以帮助我使用正确的格式吗?

1 个答案:

答案 0 :(得分:0)

tl; dr

OffsetDateTime
.parse(
    "2019-01-30T00:00:00.000+0000".replace( "+0000" , "+00:00" )
)

…和…

OffsetDateTime.now( ZoneOffset.UTC ).toString()

请参阅此code run live at IdeOne.com

  

2019-01-27T02:11:42.754Z

最后的Z表示UTC,是+00:00的快捷方式。常用于日期时间工作。在ISO 8601标准中指定。发音为“ Zulu”。

详细信息

您的问题没有提供足够的详细信息来提出确定的解决方案。但这可能会使您朝正确的方向前进。

日期时间中的时间恰好是00:00。因此,我怀疑您只需要一个日期值,而不是一个瞬间(没有时间,无时区或UTC偏移量)。如果是这样,请使用Java中的LocalDate对象,并使用标准的ISO 8601格式的文本,格式为YYYY-MM-DD。

ZoneID z = ZoneId.of( "Pacific/Auckland" ) ;
LocalDate ld = LocalDate.now( z ) ;
String output = ld.toString() ;  

您可以解析这样的字符串。 java.time 类默认情况下使用标准的ISO 8601格式,因此无需指定格式设置模式。

LocalDate ld = LocalDate.parse( "2019-01-30" ) ;

如果要以示例格式解析时刻,请解析为OffsetDateTime。不幸的是,您的输入省略了偏移量中的可选冒号字符,并且OffsetDateTime类在没有冒号的情况下在解析时有一个小错误。因此,请执行搜索替换操作以将+0000转换为00:00

String input = 2019-01-30T00:00:00.000+0000".replace( "+0000" , "+00:00" ) ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;