从 ISO 8601 日期字符串转换为 BigQuery 时间戳时出错

Chr*_*row 2 java datetime date iso8601 google-bigquery

我有以下格式的 ISO 8601 日期字符串:

String myIsoDateString = "2019-02-27T23:00:00.000Z"
Run Code Online (Sandbox Code Playgroud)

我需要使用日期字符串作为我在 BigQuery 中运行的查询的一部分。我正在尝试使用com.google.cloud.bigquery.QueryParameterValue该类将其转换为 a QueryParameterValue,类型为timestamp,如下所示:

QueryParameterValue.timestamp(myIsoDateString)
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

java.lang.IllegalArgumentException: Invalid format: "2019-02-27T23:00:00.000Z" is malformed at "T23:00:00.000Z"
Run Code Online (Sandbox Code Playgroud)

Eclipse 中时间戳方法的内联帮助指出:

Creates a QueryParameterValue object with a type of TIMESTAMP. Must be in the format"yyyy-MM-dd HH:mm:ss.SSSSSSZZ", e.g. "2014-08-19 12:41:35.220000+00:00".
Run Code Online (Sandbox Code Playgroud)

如何转换myIsoDateString为所需的格式?我可以使用更好的方法来处理从 ISO 8601 字符串转换为 BigQuery 中的时间戳吗?

use*_*768 9

对于任何试图在 BigQuery 中解析 ISO 8601 的人(这篇文章是第一个谷歌结果),试试这个:

SELECT
PARSE_TIMESTAMP('%Y-%m-%dT%H:%M:%E*SZ',  '2018-10-12T13:22:27.120Z')
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这应该在文档页面上! (2认同)

Chr*_*row 0

这有效:

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
Run Code Online (Sandbox Code Playgroud)

转换myIsoDateString为微秒并将其存储为long

long myDateInMicroseconds = DateTime.parse(myIsoDateString).toDateTime(DateTimeZone.UTC).getMillis() * 1000;
Run Code Online (Sandbox Code Playgroud)

然后将其作为参数传递给 QueryParameterValue.timestamp:

QueryParameterValue.timestamp(myDateInMicroseconds)
Run Code Online (Sandbox Code Playgroud)