2015-07-24 2 views
2

J'ai déclaré une colonne de date dans Postgres comme date.Le module Postgres du nœud pg renvoie une date erronée

Lorsque j'écris la valeur avec le module pg du nœud, l'outil Postgres pgAdmin l'affiche correctement. Lorsque je lis la valeur en utilisant pg, Au lieu de la date simple, une chaîne date-heure est fournie avec un mauvais jour.

.: par exemple

Date inserted:    1975-05-11 
Date displayed by pgAdmin: 1975-05-11 
Date returned by node's pg: 1975-05-10T23:00:00.000Z 

Puis-je empêcher pg de nœud à Appy fuseau horaire données à jour uniquement? Il est destiné au jour de naissance et le fuseau horaire d'ihmo n'a aucune pertinence ici.

+0

Cela ressemble à un bug dans node-pg. Vous utilisez le pilote de Brianc? –

+0

Ça me fait peur. Je viens de proposer à un client de passer de Qt à Node + Web. Et l'application est pleine de données date/heure –

+0

@ DenysSéguret: oui. http://github.com/brianc/node-postgres, "nom": "pg", "version": "4.4.0" –

Répondre

3

EDIT Problème réponse du développeur sur github

L'équipe noeud-postgres a décidé il y a longtemps de convertir les dates et datetimes sans fuseaux horaires à l'heure locale en les tirant. Ceci est cohérent avec de la documentation que nous avons déterrés dans le passé. Si vous enracinez autour de à travers les anciens numéros, vous trouverez les discussions. La bonne nouvelle est qu'il est trivial de contourner ce comportement et de renvoyer des dates comme bon vous semble.

Il y a des documents sur la façon de le faire ici: https://github.com/brianc/node-pg-types

Il y a probablement même un module quelque part qui va convertir les dates de postgres dans tout fuseau horaire que vous voulez (utc je devine). Et si il n'y a pas ... c'est une bonne occasion d'écrire un & partager avec tout le monde!

Message d'origine Cela ressemble à un problème dans pg-module. Je suis débutant dans JS et node, donc c'est seulement mon interprétation.

Lorsque les dates (sans partie de temps) sont analysées, l'heure locale est prise en compte. Pg \ node_modules \ pg types \ lib \ textParsers.js

if(!match) { 
    dateMatcher = /^(\d{1,})-(\d{2})-(\d{2})$/; 
    match = dateMatcher.test(isoDate); 
    if(!match) { 
     return null; 
    } else { 
     //it is a date in YYYY-MM-DD format 
     //add time portion to force js to parse as local time 
     return new Date(isoDate + ' 00:00:00'); 

Mais lorsque l'objet de la date JS est converti en une chaîne getTimezoneOffset est appliquée. pg \ lib \ utils.js s. function dateToString(date)

+0

this la réponse est géniale. totalement fait ce que je devais faire plus facile! – gonzofish