오픈 소스 프로젝트 - XE 개발 포럼
#350과 관련한 건의입니다만, 날짜/시간을 저장하는 Datetime과 (혹시 필요하다면)시간 간격을 저장하는 DatetimeSpan 클래스를 만드는 것은 어떨까요.
현재 날짜/시간 관련 처리는 매우 불편한(ztime, zdate) 방식입니다. 1970년 이전의, timestamp가 작동하지 않는 범위는 더 그렇고, 모든 날짜를 UTC 기준으로 처리하기 위해서는(사용자 Timezone 지원) 함수들을 재처리해야 합니다.
이들의 간편한 처리를 위해, Datetime 클래스를 만들어서 모든 날짜를 Datetime 형으로 저장하고 출력하게 하는 것이 좋을 것 같습니다. 내부적으로는 UTC로 저장하고 표시할 때만 사용자 Timezone으로 변환하며 add, subtract 등의 계산 메소드를 제공하여 편의를 도모할 수 있을 것입니다.
그러니까, 다음과 비슷한 형태의 클래스를 만들어서 편의를 도모하는 것이 좋지 않을까 합니다.
<?php
// PHP5 기준
class Datetime
{
protected $year, $month, $date, $hour, $minute, $second;
protected static $timezone_gap;
public function __construct($year = 0, $month = 0, $date = 0, $hour = 0, $minute = 0, $second = 0);
public function get(&$year, &$month, &$date, &$hour, &$minute, &$second);
public function set($year = 0, $month = 0, $date = 0, $hour = 0, $minute = 0, $second = 0);
public function getYear(); public function getMonth(); public function getDate();
public function getHour(); public function getMinute(); public function getSecond();
public function toTimestamp(); // Returns Unix timestamp from $this
// in $format, 'C' = Date + Time (Y-m-d H:i:s or M d, Y H:i:s), 'E' = Date, 'J' = Time, etc. = default date() format
public function format($format = 'C'); // Returns formatted output string
public function serialize(); // Returns serialized data to save to DB, file, etc.
public function add(DatetimeSpan $span); // If DatetimeSpan required
public function addValue($year, $month, $date, $hour, $minute, $second);
public function subtract(DatetimeSpan $span); // If DatetimeSpan required
public function subtractValue($year, $month, $date, $hour, $minute, $second);
public function difference(Datetime $datetime); // If DatetimeSpan required, returns DatetimeSpan value ($this - $datetime)
public static function now(); // Returns current time in Datetime type
public static function fromTimestamp($timestamp); // Returns converted Datetime data from Unix timestamp
}
class DatetimeSpan // If required
{
protected $year, $month, $date, $hour, $minute, $second;
public function __construct($year = 0, $month = 0, $date = 0, $hour = 0, $minute = 0, $second = 0);
public function get(&$year, &$month, &$date, &$hour, &$minute, &$second);
public function set($year = 0, $month = 0, $date = 0, $hour = 0, $minute = 0, $second = 0);
public function getYear(); public function getMonth(); public function getDate();
public function getHour(); public function getMinute(); public function getSecond();
public function format($format = 'C'); // Returns formatted output string
public function serialize(); // Returns serialized data to save to DB, file, etc.
}
?>
이 정도의 클래스로 모든 날짜/시간 데이터를 관리한다면 날짜/시간에 대한 계산과 일괄 처리가 간편해질 듯 합니다.
그러고 보니까 5.1부터 DateTime과 DateTimeZone이라는 클래스가 추가되었네요. 까먹고 있었습니다.
갖다 쓰면 날짜/시간 관리는 무척이나 간단해지겠지만, 버전 문제상 그럴 수는 없는 관계로 모든 기능을 직접 구현해야 할 것입니다.
사실 날짜/시간을 계산하는 루틴은 어렵지는 않습니다. 혹시 뭐하면 php 소스 코드 부분에서 DateTime 부분을 꺼내와도 되고요.
그리고 Timezone에 대해서는 어차피 사용자에게 입력받을 때 Asia/Seoul보다는 UTC+9(Seoul, Tokyo)같은 식으로 입력받기에 큰 문제는 없을 것입니다. 내부적으로는 Summer Time 데이터만 관리하면 되겠지요.
5.1 이상에서는 낭비이지만, 하위 호환성을 위한다면 어쩔 수 없는 조치인 것 같습니다.




현재 고민중인 부분을 잘 찍어주시네요. ^^
zbXE의 경우 내부적으로 DB에는 YmdHis format으로 날짜와 시간을 저장합니다.
이 시간값을 timezone적용하기 위한 방법으로 mktime을 이용하는데 이게 말씀하신 것처럼 1970년 이전은 처리하지 못하고 또 timezone에 대해 대충의 처리만 할뿐 썸머타임등 제대로 된 일시에 대한 지원을 하지 못하고 있습니다.
임시로 zdate함수에 1970년 이전일 경우에 대해서 처리를 하고 있는데 이는 미봉책일 뿐이죠.
말씀하신것처럼 datetime 관련 class를 만들고 모든 날짜와 시간을 dateime 의 instance를 이용하도록 하는 것에 대해서는 대찬성입니다.
다만 문제는 php에서 지원하는 datetime관련 class가 모두 php 5.1.0 이상에서 지원이 된다는 것입니다.
혹은 별도의 extension으로 추가 설치가 되어야 하는 서버 환경을 타게 되어 있구요.
장기적으로 zbXE의 모든 datetime은 GMT+0 으로 저장이 되어야 하고 이 값을 템플릿이나 모듈에서 사용할때 datetime 관련 클래스를 사용하도록 하는 것이 맞다고 생각합니다.
혹시 이와 관련해서 실 구현시에 좋은 방법이 있을까요?