当前位置: 首页 > 知识库问答 >
问题:

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

龚志文
2023-03-14

我有一个ISO 8601日期字符串,格式如下:

String myIsoDateString = "2019-02-27T23:00:00.000Z"

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

QueryParameterValue.timestamp(myIsoDateString)

这给了我一个错误:

java.lang.IllegalArgumentException: Invalid format: "2019-02-27T23:00:00.000Z" is malformed at "T23:00:00.000Z"

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".

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

共有3个答案

傅啸
2023-03-14

错误提示这不是正确的格式:

 "2019-02-27T23:00:00.000Z"

但是这个会是:

 "yyyy-MM-dd HH:mm:ss.SSSSSSZZ"

尝试将日期和时间之间的 T 替换为 .

鱼志诚
2023-03-14

我希望Felipe Hoffa的答案能起作用,给你你想要的:用空格代替<code>T。这里还有一些其他的建议。

明确:虽然留档给出了一个非常清晰的预期字符串示例,但从错误消息和留档(下面的链接,但您已经在Eclipse中获得了它)中不清楚QueryParameterValue.timestamp是否接受Z作为偏移量。如果我们想确定并更明确地提供所要求的格式(对于在您之后管理您的代码的人来说总是好的):

    DateTimeFormatter timestampFormatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSSxxx");
    String myIsoDateString = "2019-02-27T23:00:00.000Z";
    OffsetDateTime dateTime = OffsetDateTime.parse(myIsoDateString);
    QueryParameterValue.timestamp(dateTime.format(timestampFormatter));

这会将字符串 2019-02-27 23:00:00.000000 00:00 传递给时间戳

传递一个 long:时间戳出现在一个重载版本中,采用 Long 参数。同样,它没有记录长整线值应该是什么。编辑:你自己的答案显示,时间戳(长)自纪元以来需要微秒。完全正确的转换方法没有任何不必要的精度损失的风险是:

    String myIsoDateString = "2019-02-27T23:00:00.000Z";
    Instant dateTime = Instant.parse(myIsoDateString);
    long microsecondsSinceEpoch = TimeUnit.SECONDS.toMicros(dateTime.getEpochSecond())
            + TimeUnit.NANOSECONDS.toMicros(dateTime.getNano());
    QueryParameterValue.timestamp(microsecondsSinceEpoch);

值 1 551 308 400 000 000 将传递到时间戳

免责声明:我不是BigQuery用户。

  • QueryParameterValue留档
  • Oracle教程:日期时间
施彬彬
2023-03-14

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

SELECT
PARSE_TIMESTAMP('%Y-%m-%dT%H:%M:%E*SZ',  '2018-10-12T13:22:27.120Z')
 类似资料:
  • 在我的数据集中,我有一个变量< code>duration,其中有200万行< code>ISO 8601格式的数据。示例格式:< code>PT21S或< code>PT5M29S,< code>PT1M16S 我在将此字符串变量转换为时间时遇到问题。目前我正在使用查询: 通过该查询,可以区分持续时间是小时、分钟还是秒。我想将字符串持续时间转换为时间。我用过Regex和cast,但没有成功。当我

  • 问题内容: 如何将以下格式转换为Unix时间戳? 我从数据库获得的格式似乎最后有。我尝试使用以下方法,但没有用: 问题答案: 试试这个查询 此查询

  • 如何将以下格式转换为unix时间戳? 我从DB获得的格式似乎末尾有。我尝试使用以下方法,但没有成功:

  • 问题内容: 我有一个表示Python中的unix时间戳(即)的字符串,我想将其转换为可读的日期。使用时,我得到: 问题答案: 使用模块:

  • 问题内容: 使用PHP,我想将UNIX时间戳转换为类似于以下内容的日期字符串: 如何转换的时间戳,如到? 问题答案: 尝试这样:

  • 问题内容: 我在mysql中使用NOW()获取当前日期和时间。我想将日期值转换为varchar并将其与另一个字符串连接。我该怎么做? 问题答案: 使用DATE_FORMAT()