微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Google Cloud Dataflow to BigQuery - Javascript UDF - toLocalString 无法正常工作

如何解决Google Cloud Dataflow to BigQuery - Javascript UDF - toLocalString 无法正常工作

我使用 toLocaleString 在与 UTC 不同的时区设置日期时间。但由于某种原因它在数据流过程中不起作用。

详情如下:

  • 我正在使用 Pub/Sub Subscription to BigQuery Template。 Dataflow 从 PubSub 获取 json 格式的数据,进行转换,插入 BigQuery
  • 我想使用 UDF 进行数据转换设置。
  • (为简单起见,)输入数据仅包括 unixTimestamp。例子: {"unixTimestamp": "1612325106000"}
  • Bigquery 表有 3 列:
unix_ts:INTEGER,iso_dt:DATETIME,local_dt:DATETIME,step1:STRING,step2:STRING,step3:STRING,step4:STRING,step5:STRING,step6:STRING

unix_ts 将保留输入的 unixTimestamp 原样,iso_dt 将保留 UTC 日期时间,local_dt 将保留欧洲/柏林日期时间。

预期输出1612325106000,2021-02-03T04:05:06,2021-02-03T05:05:06,...

结果输出1612325106000,...

我使用的 UDF 转换文件

function transform(injson) {
   var input = JSON.parse(injson);

   var v_date = new Date(parseInt(input.unixTimestamp));
   var v_iso_dt = v_date.toISOString().replace('Z','');
   var v_local_dt_str = v_date.toLocaleString('en-US',{timeZone: 'Europe/Frankfurt'});
   var v_local_dt = new Date(v_local_dt_str);
   var v_diff = v_date.getTime() - v_local_dt.getTime();
   var v_local_dt_correct_zone = new Date(v_date.getTime() - v_diff);
   var v_local_dt_correct_zone_formatted = v_local_dt_correct_zone.getFullYear() + "-" +
   ("00" + (v_local_dt_correct_zone.getMonth()+1)).slice(-2) +  "-" +
   ("00" + v_local_dt_correct_zone.getDate()).slice(-2) +  "T" +
   ("00" + v_local_dt_correct_zone.getHours()).slice(-2) +  ":" +
   ("00" + v_local_dt_correct_zone.getMinutes()).slice(-2) +  ":" +
   ("00" + v_local_dt_correct_zone.getSeconds()).slice(-2) ;

   var output = {
       "unix_ts": input.unixTimestamp || null,"iso_dt": v_iso_dt  || null,"local_dt": v_local_dt_correct_zone_formatted || null,"step1": v_date  || null,"step2": v_local_dt_str   || null,"step3": v_local_dt   || null,"step4": v_diff   || null,"step5": v_local_dt_correct_zone || null,"step6": v_local_dt_correct_zone_formatted || null,};
}

附言我在 Google Cloud Dataflow to BigQuery - UDF - convert unixTimestamp to local time 中问了一个更广泛的问题。那个是关于将 unixTimestamp 转换为本地时间的最佳方法,然而,这个是关于在 DataFlow UDF 中使用 toLocaleString 的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。