2013-10-02 2 views
4

가 Sequelize이 createdAt/updatedAt는 사용자 정의 Sequelize.DATE 필드 유형에 대한 타임 스탬프에 대한 기본 시간 형식 모두로 UNIX 타임 스탬프를 사용하여 강제로 방법이 있나요 DATE 필드에 대한 UNIX 타임 스탬프를 사용합니까?Sequelize -

감사합니다.

P. 나는 MySQL을 사용하고있다.

답변

6

주어진 시간에 두 가지 가능한 날짜가 있습니다 (국제 날짜 행에 상대적인 위치에 따라 다름). 즉, UNIX 시간 소인을 날짜로 변환하면 시간대를 고려해야합니다.

예를 들어, UNIX 타임 스탬프 9466848002000-01-01 00:00:00Z입니다. 이것이 대서양의 동쪽에있는 거의 모든 곳의 새로운 밀레니엄의 첫날을 대표하는 반면, 그 바다의 서쪽에있는 모든 곳은 여전히 ​​밀레니엄 이브입니다. 어떤 날짜로 표현 되나요? 이 타임 스탬프로 날짜 변환 할 있어 동안

, 하나는 (예 : UTC 자정으로 지정된 날짜를 나타냅니다) 그렇게에 대한 자신의 규칙을 정의해야합니다 그렇지 않으면 동일한 날짜는 각 인코딩에 따라 다르게 표현 될 수있다 . 일반적으로 말해서 이것은 의도하지 않은 모든 종류의 결과를 초래할 수있는 나쁜 생각입니다.

DATE 데이터 형식이 존재하는 이유는 올바른 날짜 저장 방법입니다. 그걸 써.

+0

@Downvoter : 댓글을 달았습니까? – eggyal

+0

유닉스 시간을 저장하는 것은 시간을 저장하는 유효한 방법입니다 (일반적으로 말하면) - 로컬 날짜/시간을 해석하는 것은 UTC 시간에서 로컬/계절 오프셋을 계산하는 것입니다. – rjarmstrong

+0

@rjarmstrong : 정확히 내 대답은 뭐라고하지 않습니까?요점은 OP가 타임 스탬프를 사용하여 날짜 (및 날짜 만)를 저장하는 방법을 묻고 있다는 것이 었습니다. – eggyal

1

아니요, 적어도 아직은 없네. CreatedAt는 sequelize에서 utils.now 함수를 사용하여 설정됩니다. 이 함수는 추가 인수없이 javascript Date 함수를 사용합니다. Squelize는 Date를 호출하는 방식을 변경하기 위해 수정할 수 있지만 현재 버전에서는이를 수행 할 코드가 없습니다. 참조 here

그러나 createdAt 및 다른 타임 스탬프를 사용하지 않도록 설정하고 원시 쿼리를 사용하여 자신을 설정할 수 있습니다. 그러나 후속 기능을 희생합니다. 최상의 해결 방법은 비즈니스 로직에서 해당 필드를 유닉스 시간으로 변환 한 후 사용하는 것입니다.

+0

고마워, 나는 그런 solis에 대해 생각했다. 하지만 그럼에도 불구하고«당신은 후유증의 기능을 희생합니다.»? 날짜 지정 쿼리를 수행 할 수 없다는 뜻입니까? – f1nn

+0

sequelize 개체를 테이블에 매핑합니다. 이 매핑은 데이터베이스에 대한 객체 지향 인터페이스를 제공합니다. 이러한 값을 설정하지 않으면 sequelize는 오브젝트가 갱신되었는지 점검 할 수 없습니다. 당신은 그 논리를 재 작성해야 할 것입니다. –

1

eggyal의 대답은 MySQL에서 적절한 방법이지만, 우리 중 일부는 datetime/timestamp 대신 unix timestamp를 사용해야하는 환경이나 팀에서 일하고있을 수도 있습니다.

이 작업을 수행하는 가장 좋은 방법은 후편 내부에서 후크를 사용하는 것입니다. 당신의 각 모델의 하단에이 코드를 추가 할 수 있습니다 :

{ 
     tableName: 'Addresses', 
     hooks : { 
      beforeCreate : (record, options) => { 
       record.dataValues.createdAt = Math.floor(Date.now()/1000); 
       record.dataValues.updatedAt = Math.floor(Date.now()/1000); 
      }, 
      beforeUpdate : (record, options) => { 
       record.dataValues.updatedAt = Math.floor(Date.now()/1000); 
      } 
     } 
    } 

이것은 유닉스 타임 스탬프로 createdAtupdatedAt 필드를 삽입합니다.