UNPKG

postgrejs

Version:

Professional PostgreSQL client NodeJS

73 lines (72 loc) 2.36 kB
import { DataTypeOIDs } from '../constants.js'; import { parseDateTime } from '../util/parse-datetime.js'; const timeShift = 946684800000; export const DateType = { name: 'date', oid: DataTypeOIDs.date, jsType: 'Date', parseBinary(v, options) { const fetchAsString = options.fetchAsString && options.fetchAsString.includes(DataTypeOIDs.date); const t = v.readInt32BE(); if (t === 0x7fffffff) return fetchAsString ? 'infinity' : Infinity; if (t === -0x80000000) return fetchAsString ? '-infinity' : -Infinity; // Shift from 2000 to 1970 let d = new Date(t * 1000 * 86400 + timeShift); if (fetchAsString || !options.utcDates) d = new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()); return fetchAsString ? dateToDateString(d) : d; }, encodeBinary(buf, v, options) { if (typeof v === 'string') v = parseDateTime(v, false, false, options.utcDates); if (v === Infinity) { buf.writeInt32BE(0x7fffffff); return; } if (v === -Infinity) { buf.writeInt32BE(-0x80000000); return; } if (!(v instanceof Date)) v = new Date(v); let n = options.utcDates ? v.getTime() : v.getTime() - v.getTimezoneOffset() * 60 * 1000; n = (n - timeShift) / 1000 / 86400; const t = Math.trunc(n + Number.EPSILON); buf.writeInt32BE(t); }, parseText(v, options) { const fetchAsString = options.fetchAsString && options.fetchAsString.includes(DataTypeOIDs.date); if (fetchAsString) return v; return parseDateTime(v, false, false, options.utcDates); }, isType(v) { return (v instanceof Date && v.getHours() === 0 && v.getMinutes() === 0 && v.getSeconds() === 0 && v.getMilliseconds() === 0); }, }; function padZero(v) { return v < 9 ? '0' + v : '' + v; } function dateToDateString(d) { return (d.getFullYear() + '-' + padZero(d.getMonth() + 1) + '-' + padZero(d.getDate())); } export const ArrayDateType = { ...DateType, name: '_date', oid: DataTypeOIDs._date, elementsOID: DataTypeOIDs.date, };