본문 바로가기
기타

Mysql Timestamp to C# ticks

by COCO1337 2021. 6. 10.

Mysql에서 일반적으로 사용되는 Timestamp는 yyyy-mm-dd hh:mm:ss 로 저장되며,

SELECT UNIX_TIMESTAMP(); 를 사용해서 확인하면

이와같은 Ticks가 출력이 된다.

 

C#의 경우도 DateTime.Now는 yyyy-mm-dd hh:mm:ss로 출력이 된다.

하지만 Ticks를 출력해보면

Mysql에서 사용되는 Ticks과 차이가 있다.

 

Mysql과 C#에서 사용하는 Ticks의 기준이 서로 다르기 때문에 발생하는 문제이다.

https://dev.mysql.com/doc/refman/8.0/en/datetime.html

 

MySQL :: MySQL 8.0 Reference Manual :: 11.2.2 The DATE, DATETIME, and TIMESTAMP Types

11.2.2 The DATE, DATETIME, and TIMESTAMP Types The DATE, DATETIME, and TIMESTAMP types are related. This section describes their characteristics, how they are similar, and how they differ. MySQL recognizes DATE, DATETIME, and TIMESTAMP values in several f

dev.mysql.com

해당 문서에서 볼 수 있듯 Mysql의 Datetime에서 사용하는 Ticks는 1970-01-01 00:00:00부터 시작된다. 또한, 소수점을 지정하지 않으면 Ticks에는 초 단위로 저장이 된다.

 

https://docs.microsoft.com/ko-kr/dotnet/api/system.datetime.ticks?view=net-5.0 

 

DateTime.Ticks 속성 (System)

이 인스턴스의 날짜와 시간을 나타내는 틱 수를 가져옵니다.Gets the number of ticks that represent the date and time of this instance.

docs.microsoft.com

C#에서는 0001-01-01 00:00:00부터 시작된다. 기본적으로 100나노초 단위로 저장된다.


// C# DateTime to Mysql Datetime
// 1623283200, 2021-06-10 00:00:00
var time = new DateTime(2021, 6, 10, 0, 0, 0);
var unix = new DateTime(1970, 1, 1);
var ticks = (time.Ticks - unix.Ticks) / TimeSpan.TicksPerSecond;

 

C#에서 원하는 시간의 DateTime 객체를 생성하고 1970-01-01 00:00:00에 해당하는 틱을 빼주고 Second에 해당하는 틱을 나눠서 Mysql에서 사용되는 Datetime과 동일한 Ticks를 가지도록 변환했다.

 

반대로 Mysql Datetime Ticks에서 C# DateTime Ticks로 변환하기 위해서

위에서 했던 것과 반대로 계산한다.

// Mysql Ticks to C# DateTime Ticks
var mysqlTick = 1623283200;
var unix = new DateTime(1970, 1, 1);
var csTick = (mysqlTick * TimeSpan.TicksPerSecond) + unix.Ticks;

 

Mysql Datetime의 Ticks에 TicksPerSecond를 곱해주고 거기에 1970-01-01 00:00:00에 해당하는 Ticks를 더해주면 C# DateTime.Ticks에 해당하는 값을 구할 수 있게 된다.

반응형

'기타' 카테고리의 다른 글

윈도우(Windows)에서 배시 쉘(Bash shell) 사용해보기  (0) 2020.06.23

댓글