HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

各言語でdate format

手元にある各言語で、標準入力からUNIX TIME値を読み込んで、標準出力にフォーマットされた日時文字列を吐き出すプログラムを書いてみようと思ったメモ。

要件は以下の通り。

  • 入力されるUNIX TIME値は1つのみ
    • 不正入力のチェックは不要とする
  • タイムゾーンJST
  • 対応する日時文字列を出力
    • 例えば、「1514723696」が入力されたら「2017/12/31 12:34:56 +0900」を出力

環境

手元にあるものということで、環境は以下のものに限定する。

入力ファイルの例

  • 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"))
}

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(ぉ