为Postgresql tswtz数据类型生成带时区的服务器端时间戳

时间:2018-05-15 11:32:17

标签: javascript node.js postgresql express timestamp

我目前正在根据我的PEAN项目(Postgres,Express,Angular& Node)中javascript中PostGreSQL9.6的TSWTZ的数据类型定义生成带时区的时间戳。

根据该文件的定义是:TIMESTAMP WITH TIME ZONE' 2004-10-19 10:23:54 + 02'

我在这里创建了这个代码片段并且它正在工作,但我确信它可以通过reg-ex /模式匹配或其他方法在不缺​​乏可读性的情况下进行改进。

/* double digits for Date */
Date.prototype.yyyymmdd = function() {
    var mm = (this.getMonth() + 1).toString(); // getMonth() based on 0
    var dd = this.getDate().toString();
    return [this.getFullYear(), mm.length===2 ? '' : '0', mm, dd.length===2 ? '' : '0', dd].join(''); // padding
};

/* double digits for time */
function checkTime(i) {
    return (i < 10) ? "0" + i : i;
}

function getTSWTZ() {
    /* get padded date */
    var today = new Date();
    var todayString = today.yyyymmdd();
    var yyyy = todayString.slice(0,4);
    var mm = todayString.slice(4,6);
    var dd = todayString.slice(6,8);
    var paddedDateString = yyyy + '-' + mm + '-' + dd + ' ';
    /* get padded time */
    h = checkTime(today.getHours());
    m = checkTime(today.getMinutes());
    s = checkTime(today.getSeconds());
    paddedTimeString = h + ":" + m + ":" + s;
    /* get offset of timezone */
    var tzStr = new Date().toString();
    var pos1 = tzStr.indexOf("GMT") +3;
    var pos2 = pos1 + 3;
    var offSetTimeZone = tzStr.slice(pos1, pos2);
    var tswtz = paddedDateString + paddedTimeString + offSetTimeZone;
    return tswtz;
};

您对此有何看法?

1 个答案:

答案 0 :(得分:2)

PostgreSQL接受timestamp with time zone的几种输入格式,输出格式取决于DateStyle参数。

因此,您的代码不仅令人惊讶地复杂,而且还具有可疑的正确性。

为什么不使用Javascript的Date.now()函数,将结果除以1000并将其提供给PostgreSQL的to_timestamp(double precision)函数?

这将始终为您提供正确的价值。