secretbase.log

.NET/C#/Pythonなど

local time から始めるプログラミング言語入門

プログラミング入門としては、Hello World を標準出力に出力することがよくあります。初めて触る言語で行うサンプルとして、Hello World より少しだけ進んで local time の現在時刻を表示するサンプルコードをいくつかつくってみました。
[2013/01/24 12:34:56] という現在時刻をメッセージやログに日付付きで記録したいときに役立つフォーマットです。

扱うプログラミング言語は、TIOBE で上位にランクされる人気の言語から C Java C++ C# Python Perl JavaScript Ruby とあと いくつかのプログラミング言語や環境で試してみます。

環境としては、主にWindows上で、いくつかMSYSで行なっています*1


C による実装

clock_gettime() を用います。time.h を include することで使用可能です。

#include <stdio.h>
#include <time.h>

#define TIME_MAXSIZE 64

void nowtime(char *str)
{
	time_t timer = time(NULL);
	strftime(str, TIME_MAXSIZE, "[%Y/%m/%d %H:%M:%S]", localtime(&timer));
}

int main()
{
	char timestr[TIME_MAXSIZE];
	
	nowtime(timestr);
	printf("%s\n", timestr);

	return 0;
}

$ gcc -Wall time.c;./a
[2013/02/05 20:38:41]





Java による実装

Date 型で取得する関数 Date()があり、SimpleDateFormatクラスのformatメソッドで指定したString型に変換可能です。

import java.util.*;
import java.text.*;

public class NowTime {
	public static void main(String[] args){
		System.out.println(getNowTime());
	}
	static String getNowTime(){
		Date now = new Date();
		SimpleDateFormat fmt = new SimpleDateFormat("[YYYY/MM/dd HH:mm:ss]");
		return fmt.format(now);
	}
}

$ javac NowTime.java ; java NowTime
[2013/02/08 19:36:16]




C++ による実装

boost を用いてみたいと思います。ですが私の頭では Date_Time の仕様がよく理解できず、stackoverflow の回答をおもいっきり参考にさせて頂きました。
http://stackoverflow.com/questions/1904317/c-boost-date-with-format-dd-mm-yyyy

#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>

using namespace boost::posix_time;
using namespace std;

void nowtime(void)
{
	time_facet *facet = new time_facet("[%Y/%m/%d %H:%M:%S]");
	cout.imbue(locale(cout.getloc(), facet));
	cout << second_clock::local_time() << endl;
}

#ifdef DEBUG
int main(int argc, char **argv)
{
	nowtime();
}
#endif

$ g++ -Wall -I/usr/include/boost -DDEBUG nowtime.cpp ;./a
[2013/02/16 23:16:32]





C# による実装

DateTimeオブジェクトを取得し ToString で文字列に変換します。

using System;

class Datetime
{
	public static void Main()
	{
		Console.WriteLine(DateTime.Now.ToString("[yyyy/MM/dd HH:mm:ss]"));			
	}
}

Visual Studio コマンドプロンプトを開くことで、csc.exe(コンパイラ)にパスが通ります。

> csc nowtime.cs にてコンパイルを行いましょう。
> nowtime
[2013/02/23 22:28:45]




Python による実装

標準ライブラリ datetime が使いやすいです。import しましょう。

import datetime

print datetime.datetime.today().strftime('[%Y/%m/%d %H:%M:%S]')

python nowtime.py
[2013/01/24 21:25:11]




Perl による実装

localtime 関数にて現在の時刻を示す9個の時刻情報が返却されますので、書式を整えましょう。

#!/usr/bin/perl

sub nowtime {
	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

	my $date = sprintf("[%04d/%02d/%02d %02d:%02d:%02d]\n", 
					   $year+1900,$mon+1,$mday,$hour,$min,$sec);
	return $date;
}

print nowtime();

$ perl nowtime.pl
[2013/02/17 00:41:47]




JavaScript による実装

Dateオブジェクトにて現在時刻が取得できます。

var today = new Date();

var fmt = "["+ today.getFullYear()+"/"+today.getMonth()+1
        +"/"+today.getDay()+" "
        +today.getHours()+":"+today.getMinutes()+":"+today.getSeconds()+"]"

WScript.echo(fmt);

Windows 上で explorer nowtime.js という形で起動します(またはnowtime.js ファイル)をダブルクリックします。



Ruby による実装

#!/usr/bin/env ruby

def nowtime
  return Time.now.strftime("[%Y-%m-%d %H:%M:%S]")
end

puts nowtime

$ ruby nowtime.rb
[2013-02-17 01:36:04]



bash による実装

date コマンド(GNU date) に頼ることにします。

echo "["`date +"%Y/%m/%d %k:%M:%S"`"]"

[2013/01/24 20:24:25]




コマンドプロンプト(Windowsバッチファイル)による実装

echo [%date% %time:~,-3%]

[2013/04/08 22:30:52]




Windows Power Shell による実装

Get-Date コマンドレットを使用します。

PS C:\> Get-Date -format ["yyyy/MM/dd hh:mm:ss"]

[2013/04/09 12:13:36]





Emacs Lisp による実装

M-x にて ielm にてインタラクティブシェルを起動します。
(スクラッチバッファにて C-j でも実行することができます)

ELISP> (format-time-string "[%Y/%m/%d %H:%M:%S]" (current-time))
"[2013/03/01 10:50:44]"

さいごに

表示された日付時刻がまちまちなのは、それぞれのプログラミング言語で実装した時刻の差です。いろいろな言語を気長に試した結果なので気にしないでくださいね。



追記。その他いくつかの言語による実装を行われた方がいましたのでリンクをご紹介します。

*1:C,C++perlbashはMSYSで行いました。