各言語でdate format
手元にある各言語で、標準入力からUNIX TIME値を読み込んで、標準出力にフォーマットされた日時文字列を吐き出すプログラムを書いてみようと思ったメモ。
要件は以下の通り。
- 入力されるUNIX TIME値は1つのみ
- 不正入力のチェックは不要とする
- タイムゾーンはJST
- 対応する日時文字列を出力
- 例えば、「1514723696」が入力されたら「2017/12/31 12:34:56 +0900」を出力
環境
手元にあるものということで、環境は以下のものに限定する。
- CentOS 7
入力ファイルの例
- 001.txt
1514723696
期待される出力の例
- 001.txt
2017/12/31 12:34:56 +0900
Java
import java.io.PrintWriter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Scanner; public class Main { public static void main(String[] args) { try (Scanner in = new Scanner(System.in); PrintWriter out = new PrintWriter(System.out) ) { long millisecond = in.nextLong() * 1000L; DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss ZZZZZ"); String str = df.format(millisecond); out.println(str); } } }
C
#include <stdio.h> #include <time.h> int main(int argc, char** argv) { time_t second; scanf("%ld", &second); char str[32]; struct tm* timeinfo; timeinfo = localtime(&second); strftime(str, sizeof(str), "%Y/%m/%d %H:%M:%S %z", timeinfo); printf("%s\n", str); return 0; }
C++
#include <ctime> #include <iostream> using namespace std; int main(int argc, char** argv) { time_t second; cin >> second; char str[32]; struct tm* timeinfo; timeinfo = localtime(&second); strftime(str, sizeof(str), "%Y/%m/%d %H:%M:%S %z", timeinfo); cout << str << endl; return EXIT_SUCCESS; }
PHP
(2017/12/07) DateTimeクラスを使ったバージョンも書いてみたので追記。大して変わらないけど(ぉ
date()版
<?php $lines = file('php://stdin'); $second = (int)$lines[0]; date_default_timezone_set("Asia/Tokyo"); printf("%s\n", date("Y/m/d H:i:s O", $second));
DateTimeクラス版
<?php $lines = file('php://stdin'); $second = (int)$lines[0]; date_default_timezone_set("Asia/Tokyo"); $dt = new DateTime(); $dt->setTimestamp($second); printf("%s\n", $dt->format("Y/m/d H:i:s O"));
Python 2
import sys import pytz from datetime import datetime line = sys.stdin.readline() second = int(line) dt = datetime.fromtimestamp(second) dt = pytz.timezone('Asia/Tokyo').localize(dt) str = dt.strftime("%Y/%m/%d %H:%M:%S %z") print str
これをやるには、「yum pytz」でpytzモジュールをインストールしておく必要がある。
Python 3
import sys import pytz from datetime import datetime line = sys.stdin.readline() second = int(line) dt = datetime.fromtimestamp(second) dt = pytz.timezone('Asia/Tokyo').localize(dt) str = dt.strftime("%Y/%m/%d %H:%M:%S %z") print(str)
これをやるには、(自前ビルドしたPythonなので)「pip3 install pytz」でpytzモジュールをインストールしておく必要がある。
Ruby
line = STDIN.gets second = line.to_i t = Time.at(second) str = t.strftime("%Y/%m/%d %H:%M:%S %z") print str,"\n"
Perl
use POSIX 'strftime'; my $line = readline(STDIN); my $second = $line + 0; my $str = strftime "%Y/%m/%d %H:%M:%S %z", localtime($second); print $str,"\n";
Go
package main import ( "bufio" "fmt" "io" "os" "strconv" "time" ) func main() { stdin := bufio.NewReader(os.Stdin) buf := make([]byte, 0, 1024) second := int64(0) for { line, prefix, err := stdin.ReadLine() if err == io.EOF { break } buf = append(buf, line...) if prefix { continue } s := string(buf) tmpSec, err2 := strconv.Atoi(s) if err2 != nil { panic(err2) } second = int64(tmpSec) break } t := time.Unix(second, 0) fmt.Println(t.Format("2006/01/02 15:04:05 -0700")) }
- time - The Go Programming Language
- Golangでの日付のフォーマット指定の方法について - Qiita
- Goのtimeパッケージのリファレンスタイム(2006年1月2日)は何の日? - Qiita
Go言語の日時のフォーマット指定子の仕様は謎だ‥
bash
#! /bin/bash IFS=$'\n' read line second=$(echo ${line} | sed -e 's/^\([+-]*[0-9][0-9]*\).*/\1/') second=$((second+0)) date -d "@${second}" +"%Y/%m/%d %H:%M:%S %z"
man date
(ぉ