Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // DateTime.hpp
- #pragma once
- #include <tuple>
- #include <iostream>
- #include <string>
- struct Date : std::tuple<int, int, int> {
- typedef std::tuple<int, int, int> base;
- Date(const int& year, const int& month, const int& day)
- : base(year, month, day){}
- };
- int DateFormat(int y, int m, int d);
- std::string ToJapaneseEraYear(int y, int m, int d);
- int calc_year(int year, int type);
- bool is_first_year(int year);
- std::ostream& operator<<(std::ostream& stream, const Date& date);
- // DateTime.cpp
- #include "DateTime.hpp"
- #include <sstream>
- int DateFormat(int y, int m, int d)
- {
- return y * 10000 + m * 100 + d;
- }
- std::string ToJapaneseEraYear(int y, int m, int d)
- {
- int target = DateFormat(y, m, d);
- int ad = y;
- std::stringstream ss;
- enum { Meiji, Taisho, Showa, Heisei, Reiwa };
- const char* names[] = { "明治","大正","昭和","平成","令和" };
- int gengo_type = 0;
- int ret = 0;
- if (target <= DateFormat(1868, 10, 22)) {
- ss << ad << "年(" << names[Meiji] << "以前)" << m << "月" << d << "日";
- } else if (target >= DateFormat(1868, 10, 23) && target <= DateFormat(1912, 7, 29)) {
- gengo_type = Meiji;
- ret = calc_year(y, gengo_type);
- if (is_first_year(ret)) {
- ss << ad << "年(" << names[Meiji] << "元年)" << m << "月" << d << "日";
- } else {
- ss << ad << "年(" << names[Meiji] << ret << "年)" << m << "月" << d << "日";
- }
- }else if (target >= DateFormat(1912, 7, 30) && target <= DateFormat(1926, 12, 24)) {
- gengo_type = Taisho;
- ret = calc_year(y, gengo_type);
- if (is_first_year(ret)) {
- ss << ad << "年(" << names[Taisho] << "元年)" << m << "月" << d << "日";
- }
- else {
- ss << ad << "年(" << names[Taisho] << ret << "年)" << m << "月" << d << "日";
- }
- } else if (target >= DateFormat(1926, 12, 25) && target <= DateFormat(1989, 1, 7)) {
- gengo_type = Showa;
- ret = calc_year(y, gengo_type);
- if (is_first_year(ret)) {
- ss << ad << "年(" << names[Showa] << "元年)" << m << "月" << d << "日";
- }
- else {
- ss << ad << "年(" << names[Showa] << ret << "年)" << m << "月" << d << "日";
- }
- // 平成:1989年1月8日-2019年4月30日
- } else if (target >= DateFormat(1989, 1, 8) && target <= DateFormat(2019, 4, 30)) {
- gengo_type = Heisei;
- ret = calc_year(y, gengo_type);
- if (is_first_year(ret)) {
- ss << ad << "年(" << names[Heisei] << "元年)" << m << "月" << d << "日";
- }
- else {
- ss << ad << "年(" << names[Heisei] << ret << "年)" << m << "月" << d << "日";
- }
- } else if (target >= DateFormat(2019, 5, 1)) {
- gengo_type = Reiwa;
- ret = calc_year(y, gengo_type);
- if (is_first_year(ret)) {
- ss << ad << "年(" << names[Reiwa] << "元年)" << m << "月" << d << "日";
- }
- else {
- ss << ad << "年(" << names[Reiwa] << ret << "年)" << m << "月" << d << "日";
- }
- }
- return ss.str();
- }
- int calc_year(int year, int type)
- {
- enum { Meiji, Taisho, Showa, Heisei, Reiwa };
- int result;
- switch (type) {
- case Meiji:
- result = year + 33 - 1900;
- break;
- case Taisho:
- result = year - 11 - 1900;
- break;
- case Showa:
- result = year - 25 - 1900;
- break;
- case Heisei:
- result = year + 12 - 2000;
- break;
- case Reiwa:
- result = year - 18 - 2000;
- break;
- }
- return result;
- }
- bool is_first_year(int year)
- {
- if (year == 1)
- return true;
- else
- return false;
- }
- std::ostream& operator<<(std::ostream& stream, const Date& date)
- {
- int year = std::get<0>(date);
- int month = std::get<1>(date);
- int day = std::get<2>(date);
- std::string dates = ToJapaneseEraYear(year, month, day);
- return stream
- << dates;
- }
- // main.cpp
- #include <iostream>
- #include "DateTime.hpp"
- int main()
- {
- Date d(2019, 12, 31), d2(2020, 1, 1);
- std::cout << d << std::endl;
- std::cout << d2 << std::endl;
- }
- /*
- 出力結果:
- 2019年(令和元年)12月31日
- 2020年(令和2年)1月1日
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement