Web Programmerメモ

プログラム開発のメモです

1582年10月4日の翌日は?

はじめに

以下の記事を読んでたら、
1582/10/4の翌日がほんとに1582/10/15になるかを確かめたくなった。 nagise.hatenablog.jp

というわけで、今回はJavaPHPPythonとGoで検証をしてみた。

結論

Javaのみ1582/10/4の翌日が1582/10/15になった。
PHPPythonとGoは1582/10/4の翌日が1582/10/5だった。  

各言語のバージョン

ローカルPCに入っているバージョンを使用。*1

検証

Java

Javaは内部的にユリウス暦グレゴリオ暦の切り替えを行っている。

ソースコード

import java.util.Calendar;
import java.util.GregorianCalendar;

public class Test {

    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        
        c.set(1582, Calendar.OCTOBER, 4);
        System.out.println(c.getTime());
        c.add(Calendar.DAY_OF_MONTH, 1);
        System.out.println(c.getTime());
        
        System.out.println("---------------");
        
        c = new GregorianCalendar(1582, Calendar.OCTOBER, 4);
        System.out.println(c.getTime());
        c.add(Calendar.DAY_OF_MONTH, 1);
        System.out.println(c.getTime());
    }

}

実行

$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
$ 
$ javac Test.java
$ java Test
Thu Oct 04 03:29:27 JST 1582
Fri Oct 15 03:29:27 JST 1582
---------------
Thu Oct 04 00:00:00 JST 1582
Fri Oct 15 00:00:00 JST 1582

PHP

Javaみたいなことはやってない。

ソースコード

format('Y-m-d')."\n";
echo $date->modify('+1 days')->format('Y-m-d')."\n";

実行

$ php -v
PHP 7.4.0 (cli) (built: Mar 14 2020 18:05:20) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
$ 
$ php Test.php 
1582-10-04
1582-10-05

Python

Javaみたいなことはやってない。

ソースコード

import datetime

date = datetime.date(1582, 10, 4)
print(date)
print(date + datetime.timedelta(days=1))

実行

$ python3 --version
Python 3.7.5
$
$ python3 Test.py 
1582-10-04
1582-10-05

■Go

Javaみたいなことはやってない。

ソースコード

package main

import(
    "fmt"
    "time"
)

func main() {
    t := time.Date(1582, 10, 4, 0, 0, 0, 0, time.Local)
    fmt.Println(t)

    t = t.AddDate(0, 0, 1)
    fmt.Println(t)
}

実行

$ go version
go version go1.13 darwin/amd64
$ 
$ go run Test.go
1582-10-04 00:00:00 +0900 JCST
1582-10-05 00:00:00 +0900 JCST

終わりに

しょうもないことに時間を使ってしまったと反省。

なお、Perlでも試そうとしたが、CPANモジュールをインストールできなくて諦めた。
(また今度、気が向いたときにやる)

*1:最新バージョンじゃない