[C++] いつかどこかの時刻

時刻を出すのが嫌になった。こうしよう。

# タイムスリップ時刻（その１）

```cpp
// Referrence : http://stackoverflow.com/questions/19555121/how-to-get-current-timestamp-in-milliseconds-since-1970-just-the-way-java-gets

#include <iostream> // <<
#include <iomanip> // std::setfill(...)
#include <sstream> // std::istringstream, std::ostringstream
#include <chrono> // 時刻

// いつか、どこかで現在時刻
static std::string getTimeslipNow()
{
	// どこか外国の 1969年12月31日19時ぐらいから数えたミリ秒だろうか？
	std::chrono::milliseconds ms = std::chrono::duration_cast< std::chrono::milliseconds >(
		std::chrono::system_clock::now().time_since_epoch()
		);

	long long hours = ms.count() / 1000 / 60 / 60 % 24;
	long long minutes = ms.count() / 1000 / 60 % 60;
	long long seconds = ms.count() / 1000 % 60;
	long long milliseconds = ms.count() % 1000;

	std::ostringstream oss;
	oss << std::setfill('0') << std::setw(2) << hours  << ":" << std::setfill('0') << std::setw(2) << minutes <<  " " << std::setfill('0') << std::setw(2) << seconds << "sec '" << std::setfill('0') << std::setw(3) << milliseconds << "msec";
	return oss.str();
}

int main()
{
	for (;;)
	{
		std::cout << "What time is it, Doc? " << std::endl;
		std::cout << "It's " << getTimeslipNow() << "." << std::endl;
		std::string unuse;
		std::getline(std::cin, unuse);
	}

	return 0;
}
```

これでいいや……。

# タイムスリップ時刻（その２）

コメントをもらった。

```cpp
// Referrence : http://stackoverflow.com/questions/19555121/how-to-get-current-timestamp-in-milliseconds-since-1970-just-the-way-java-gets
// Referrence : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0355r2.html
// Referrence : https://cpprefjp.github.io/reference/chrono/time_point.html

#include <iostream> // <<
#include <iomanip> // std::setfill(...)
#include <sstream> // std::istringstream, std::ostringstream
#include <chrono> // 時刻

// いつか、どこかで現在時刻
static std::string getTimeslipNow()
{
    // (2017-03-17 修正) 誤: どこか外国の 1969年12月31日19時ぐらいから数えたミリ秒だろうか？
    //                  正: 1970年1月1日 0時0分0秒 が起点 (UNIX誕生)
    // (2017-03-17 修正) 誤: using ch = std::chrono;
    //                  正: namespace ch = std::chrono;
    namespace ch = std::chrono;
    const auto ms = ch::duration_cast<ch::milliseconds>(
        ch::system_clock::now().time_since_epoch()
    );

    // long long hours = ms.count() / 1000 / 60 / 60 % 24;
    // long long minutes = ms.count() / 1000 / 60 % 60;
    // long long seconds = ms.count() / 1000 % 60;
    // long long milliseconds = ms.count() % 1000;
    const auto hours   = ch::duration_cast<ch::hours>(ms).count()   % 24;
    const auto minutes = ch::duration_cast<ch::minutes>(ms).count() % 60;
    const auto seconds = ch::duration_cast<ch::seconds>(ms).count() % 60;
    const auto milliseconds = ms.count() % 1000;

    std::ostringstream oss;
    oss
        << std::setfill('0') << std::setw(2) << hours
        << ":"
        << std::setfill('0') << std::setw(2) << minutes
        << " "
        << std::setfill('0') << std::setw(2) << seconds
        << "sec '"
        << std::setfill('0') << std::setw(3) << milliseconds
        << "msec";
    return oss.str();
}

int main()
{
	for (;;)
	{
		std::cout << "What time is it, Doc? " << std::endl;
		std::cout << "It's " << getTimeslipNow() << "." << std::endl;
		std::string unuse;
		std::getline(std::cin, unuse);
	}

	return 0;
}
```

なんか　型キャスト　にしているということは　１３０日は　何時間か、みたいな単位変換計算も　ミリ秒、秒、分、時、日、週、月、年　の組み合わせ（例えば８×８で６４の組み合わせ）のどれも　型キャスト　一発でワンライナーでいけるのだろう。
それができないのだったら　関数６４個　死ぬ気で実装してるのと変わらないしな……。

# 余白で駄弁るか
C++ というのは 10万行ぐらいの C 言語のプログラムを保守するのが個人では大変だ、というところから生まれた、という話しを　何で読んだのか　そう把握している。

その手法の１つに **ブラックボックス化** がある。このコードが **中で何をやっているか分からない** というのは C++ の本質で、中でどう動いているかの代わりに **使い方** が示されるのみだ。

C++プログラマは 10万行のコードから開放され、マニュアルを正しく把握することに縛られることになる。そのとき、 **ソースを読めば分かる** という攻略法は、C++の正しくない扱い方となった。

まだまだ　結論もなく駄弁るんで時間がほしい。

## 日ごろの生活で　暦を正しく把握している人がいるだろうか
西暦には　１００年に一度　うるう年が無いが、４００年に一度　うるう年があるとか、
明治政府が　太陰暦から太陽暦に切り替えるときに　１２月が２日しか無かったとか、

日付の変換プログラムとか書きたくない。

正しい挙動をするプログラムは、「このプログラムおかしいんじゃないの？」と　人から言われることにもなりかねない。コンピューター将棋の飛車切りの寄せではよく見られる話しだ。 **ちゃんと動いているんだが、プログラマから見るとバグにしか見えない挙動** は 将棋というものをそれぐらい **簡単なもの** として捉えていたということでもあり、**なんにしろ 人はなんでもかんでも簡単だと思っている** という説明で人間を理解しておくと 自然界とは辛抱強い人が勝つために誤差はあるのだ、ということが逆説的に出てくる。

ゲームには、これルール上の欠陥じゃないの？と思われることが　むしろゲームの奥行を深めているということがある。

まだ結論のない話しを長々としたいぞ。