问题描述
我使用 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 (将#修改为@)