Open Source Web Development Tutorials - Dev Shed
UNIXの時刻フォーマットの謎を解明する
(2008/11/17公開)
変換の例
まず、C#のサンプルコードから始めることにしよう。内部関数のDateTime関数と.AddSecondsメソッドを使用することにしよう。アルゴリズムは単純だ。ユーザーにUNIX時刻を入力するように求め、倍精度に変換して、1970年1月1日から始まる新しいデータを作成し、その値に所定の秒数を加算する。最後に、DateTimeフォーマットでフォーマット済みの、そのデータを出力する。このコードは次のようになる。
Console.Write("Enter the source UNIX time: ");
double unixTime = double.Parse(Console.ReadLine());
DateTime convTime = new DateTime(1970, 1, 1).AddSeconds(unixTime);
Console.WriteLine("The converted time is: " + convTime);
出力をチェックする。
Enter the source UNIX time: 1206959497
The converted time is: 3/31/2008 10:31:37 AM
Press any key to continue . . .
今度は別の方法でやってみよう。今度は、現在の時刻を使用してみよう。DateTimeの.Nowプロパティを使用して、現在の時刻を取得することにし、新しい倍精度変数を作成し、UNIXフォーマットで時刻を表すことにしよう。今日の日付と1970年1月1日との間にオフセットが存在すれば、それを計算することができる。減算を使用して計算できる。その後で、.TotalSecondsを使用して倍精度を作成する。
DateTime currentTime = DateTime.Now;
Console.WriteLine("The current time now is: " + currentTime);
double currentUnixTime = (currentTime ?
new DateTime(1970, 1, 1)).TotalSeconds;
Console.WriteLine("The current UNIX time now: " +
Math.Round(currentUnixTime,0));
もちろん、これも出力する。この記事を書いている、まさにその時刻だ。次のようになった。
The current time now is: 3/31/2008 2:06:03 PM
The current UNIX time now: 1206972364
Press any key to continue . . .
UNIXなどの*NIXオペレーティングシステムを使用するときは、たいていUNIXタイムスタンプが必要だから、このブログの投稿(エントリー)を見つけたときに、迷うことなくブックマークしておいた。皆さんも同じようにしておくことを強くお勧めする。bash-perlやawk(スクリプトおよびプログラミング用の言語)での変換を行うソリューションもいくつか含まれている。
次のコードサンプルを調べてみることにしよう。EPOCH変数が元のUnix時刻だ。
!#/bin/bash
EPOCH=1000000000
DATE=$(perl -e "require ‘ctime.pl’; print &ctime($EPOCH); ")
echo $DATE
DATE=$(perl -e "print scalar(localtime($EPOCH)) ")
echo $DATE
DATE=$(echo $EPOCH|awk ‘{print strftime(”%c”,$1)}’)
echo $DATE
DATE=$(awk “BEGIN { print strftime(”%c”,$EPOCH) }”)
echo $DATE
UNIXオペレーティングシステムであれば、次のコマンドも使用できる。
date -d "dategoeshere" +%s
上の例から分かるように、Perlのlocaltimeの構文は次のようになる。
perl -e "print scalar localtime()"
サーバーサイドのプログラマなら、MySQLがY-m-d H:i:sフォーマットのタイムスタンプを必要とすることはよく知っている。現在の日時を「取得する」テクニックのほぼすべては、UNIXの時刻フォーマットで返される。ソリューションは変換だ。それに、これはPHPで実行できる。次のコード サンプルを見てみよう。ここでは、相互に変換するために2つの関数を作成している。
<?php
function unixToMySQL($unixtime)
{
return date('Y-m-d H:i:s', $timestamp);
}
… rest of the code goes here …
function convertToUnix($plaintime)
{
$plaintime = explode("/",$plaintime);
return mktime(0,0,0,$plaintime[1],$plaintime[2],plaintime[0]);
}
… rest of the code goes here …
?>
このアルゴリズムは、まったく明快だ。date関数は、UNIXの時刻フォーマットから、他の任意の「伝統的な」フォーマットへの変換に必要なことを行っている。この例のY-m-d H:i:sなど、必要なフォーマットを指定する必要があるだけだ。だが、これは、状況が逆で、文字列パラメーターを3つの部分に分ける必要がある場合には、さらに面白くなる(それぞれのスラッシュ「/」のところで explode関数を使用)。
ここではmktime() 関数を使用して、必要なパラメーターを与える時刻を作成している。最初の3つのパラメーターとして0, 0, 0を選択していることに注意してほしい。これは、00:00:00にUNIX時刻を作成したことを意味する。われわれは、純粋に日時文字列の分割とその変換に集中しているのだ。それでは、これらのパラメーターを年、月、日で指定しよう。
次のPHPソリューションの方が短いが、DD/MM/YYの信頼性に欠ける。
# behaves erroneously with DD/MM/(YY)YY timestamps
strtotime($date);
また、筆者が見つけたこのブログ(http://jehiah.cz/archive/oracle-date-to-unix-timestamp)の投稿では、システム時刻(SYSDATE)を取得して、まあまあ標準のフォーマット(DD-MMM-YYYY)に変換するORACLEコマンドについての記事を読むことができる。86400の乗算をベースにしているが、われわれは01-JAN-1970からのオフセットを計算したばかりである。
SELECT (sysdate - to_date('01-JAN-1970','DD-MON-YYYY')) * (86400) AS dt FROM dual;
次のMySQLの例も挙げておこう。この構文を、ぜひチェックしてほしい。
mysql> SELECT UNIX_TIMESTAMP('2008-03-31 16:34:14');
1206977654
UNIX_TIMESTAMP() -> Return a UNIX timestamp
FROM_UNIXTIME() -> Format date as a UNIX timestamp
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








