2023年2月28日火曜日

UNIX時間(3)

小学校でプログラミング教育などともがいているうちに,時代は,プロンプト工学(Wikipediaに中文はあるが日本語はない)へ向かう。AI Chat で使う自然言語である英語自身がこれから最も重要なプログラミング言語になるという怪しいうわさが流れている。日本語は,もとのドキュメント量が1桁少なくて,良質の結果を得られない三流プログラミング言語になろうとしている。

そこで時代に逆行して,いろいろなプログラミング言語の表層入門 のために,UNIX時間を出力するコードを調べている。頭がぐちゃぐちゃになってどれもこれも身につかないところが楽しい。まあ,40年前にカーニハン・リッチーのポインタでつまずいて,Turbo Pascalで少し息を吹き返したころから,自分の進歩は止まっているのだ。

第1回ではお気に入りのWolfram 言語とJulia,第2回ではFortran95を取り上げたので,今回は,C++(1983-)とSwift(2014-)である。Cに挫折しているのでC++も同じようになりそうだし,Appleの最新言語Swiftだとどうなることか。Swiftはスクリプト言語(swift)としてもコンパイラ言語(swiftc)としても使えるところがありがたい。なお,Apple M1 macOS場合,cppではエラーが起きるので c++ でコンパイルする必要があった。あと,swiftの拡張子が.swiftというのも少しだるい。

#include <iostream>

#include <sys/time.h>

#include <cmath>

using std::cout; using std::endl;


int main() {

    struct timeval ima;

    time_t ut, ut0, ut8;

    struct tm t;

    struct tm t0 = { 0, 0, 9, 1, 0, 70, -1 };

    struct tm t8 = { 7, 14, 12, 18, 0, 123, -1 };

//現在時刻の取得(msec)

    gettimeofday(&ima, nullptr);

    time_t mnow = (ima.tv_sec * 1000) + (ima.tv_usec / 1000);

    cout << "  msec since epoch: " << mnow << endl << endl;

//UNIX時間へ変換

    ut = time(nullptr);

    cout << "  unixtime: " << ut << endl;

//年月日時刻へ変換

    cout << "  day-time: " << ctime(&ut) << endl;

//UNIX基準時(JST)

    ut0 = mktime(&t0); // ut0 = 0

    cout << "  unixtime: " << ut0 << endl;

    cout << "  day-time: " << ctime(&ut0) << endl;

//2038年問題(JST)

    ut8 = mktime(&t8); // ut8 = 2^31-1

    cout << "  unixtime: " << ut8 << endl;

    cout << "  dat-time: " << ctime(&ut8) << endl;

    return EXIT_SUCCESS;

}




#! /usr/bin/swift

import Foundation


//現在時刻の取得(msec)

let date: Date = Date()

let unixtime: Int64 = Int64(date.timeIntervalSince1970)

let utime_ms: Int64 = Int64(date.timeIntervalSince1970*1000)

print(utime_ms)


//UNIX時間へ変換

var time = TimeInterval(integerLiteral: unixtime)

print(time)

//年月日時分秒へ変換(GMT)

var day = Date(timeIntervalSince1970: time)

print(day)

//UNIX基準時(GMT)

var zt = Int64(0)

var ut = TimeInterval(integerLiteral: zt)

var ud = Date(timeIntervalSince1970: ut)

print(ut)

print(ud)

//2038年問題(GMT)

zt = Int64(pow(2,Double(31)))-1

ut = TimeInterval(integerLiteral: zt)

ud = Date(timeIntervalSince1970: ut)

print(ut)

print(ud)


C++の構造体に代入しようとして四苦八苦した。C言語の系列は includeファイルが面倒なので,どうも好きになれない。情報が沢山あるのはありがたいのだけれど。Swiftは,Appleから出ているドキュメントがわかりにくいので,これも好きになれないかも。


0 件のコメント: