TEDIA会員に登録したメールアドレスとパスワードを入力してください

メールアドレス:

     パスワード:


パスワードを忘れた方はパスワードの確認を行ってください。

TEDIA会員へのご登録がお済みで無い方はこちらで登録ができます


>> テクノロジーポータル TEDIA トップページへ戻る <<

mark Software Developer's Think IT mark 失敗しないソフト選び Find-IT mark テクノロジーポータル TEDIA

会員登録 登録情報管理

TEDIA SponsorsOpen 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


前のページ     1    2    3    4    次のページ

Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.