Advertisement
Naohiro19

Japanese Era Console Ver.

May 4th, 2019
739
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.36 KB | None | 0 0
  1. // DateTime.hpp
  2. #pragma once
  3.  
  4. #include <tuple>
  5. #include <iostream>
  6. #include <string>
  7.  
  8. struct Date : std::tuple<int, int, int> {
  9.     typedef std::tuple<int, int, int> base;
  10.     Date(const int& year, const int& month, const int& day)
  11.         : base(year, month, day){}
  12. };
  13.  
  14. int DateFormat(int y, int m, int d);
  15. std::string ToJapaneseEraYear(int y, int m, int d);
  16. int calc_year(int year, int type);
  17. bool is_first_year(int year);
  18.  
  19. std::ostream& operator<<(std::ostream& stream, const Date& date);
  20.  
  21. // DateTime.cpp
  22. #include "DateTime.hpp"
  23. #include <sstream>
  24.  
  25. int DateFormat(int y, int m, int d)
  26. {
  27.     return y * 10000 + m * 100 + d;
  28. }
  29.  
  30. std::string ToJapaneseEraYear(int y, int m, int d)
  31. {
  32.     int target = DateFormat(y, m, d);
  33.     int ad = y;
  34.     std::stringstream ss;
  35.     enum { Meiji, Taisho, Showa, Heisei, Reiwa };
  36.     const char* names[] = { "明治","大正","昭和","平成","令和" };
  37.     int gengo_type = 0;
  38.     int ret = 0;
  39.    
  40.     if (target <= DateFormat(1868, 10, 22)) {
  41.         ss << ad << "年(" << names[Meiji] << "以前)" << m << "月" << d << "日";
  42.     } else if (target >= DateFormat(1868, 10, 23) && target <= DateFormat(1912, 7, 29)) {
  43.         gengo_type = Meiji;
  44.         ret = calc_year(y, gengo_type);
  45.         if (is_first_year(ret)) {
  46.             ss << ad << "年(" << names[Meiji] << "元年)" << m << "月" << d << "日";
  47.         } else {
  48.             ss << ad << "年(" << names[Meiji] << ret << "年)" << m << "月" << d << "日";
  49.         }
  50.     }else if (target >= DateFormat(1912, 7, 30) && target <= DateFormat(1926, 12, 24)) {
  51.         gengo_type = Taisho;
  52.         ret = calc_year(y, gengo_type);
  53.         if (is_first_year(ret)) {
  54.             ss << ad << "年(" << names[Taisho] << "元年)" << m << "月" << d << "日";
  55.         }
  56.         else {
  57.             ss << ad << "年(" << names[Taisho] << ret << "年)" << m << "月" << d << "日";
  58.         }
  59.     } else if (target >= DateFormat(1926, 12, 25) && target <= DateFormat(1989, 1, 7)) {
  60.         gengo_type = Showa;
  61.         ret = calc_year(y, gengo_type);
  62.         if (is_first_year(ret)) {
  63.             ss << ad << "年(" << names[Showa] << "元年)" << m << "月" << d << "日";
  64.         }
  65.         else {
  66.             ss << ad << "年(" << names[Showa] << ret << "年)" << m << "月" << d << "日";
  67.         }
  68.     // 平成:1989年1月8日-2019年4月30日
  69.     } else if (target >= DateFormat(1989, 1, 8) && target <= DateFormat(2019, 4, 30)) {
  70.         gengo_type = Heisei;
  71.         ret = calc_year(y, gengo_type);
  72.         if (is_first_year(ret)) {
  73.             ss << ad << "年(" << names[Heisei] << "元年)" << m << "月" << d << "日";
  74.         }
  75.         else {
  76.             ss << ad << "年(" << names[Heisei] << ret << "年)" << m << "月" << d << "日";
  77.         }
  78.     } else if (target >= DateFormat(2019, 5, 1)) {
  79.         gengo_type = Reiwa;
  80.         ret = calc_year(y, gengo_type);
  81.         if (is_first_year(ret)) {
  82.             ss << ad << "年(" << names[Reiwa] << "元年)" << m << "月" << d << "日";
  83.         }
  84.         else {
  85.             ss << ad << "年(" << names[Reiwa] << ret << "年)" << m << "月" << d << "日";
  86.         }
  87.     }
  88.     return ss.str();
  89. }
  90.  
  91. int calc_year(int year, int type)
  92. {
  93.     enum { Meiji, Taisho, Showa, Heisei, Reiwa };
  94.     int result;
  95.     switch (type) {
  96.     case Meiji:
  97.         result = year + 33 - 1900;
  98.         break;
  99.     case Taisho:
  100.         result = year - 11 - 1900;
  101.         break;
  102.     case Showa:
  103.         result = year - 25 - 1900;
  104.         break;
  105.     case Heisei:
  106.         result = year + 12 - 2000;
  107.         break;
  108.     case Reiwa:
  109.         result = year - 18 - 2000;
  110.         break;
  111.     }
  112.     return result;
  113. }
  114.  
  115. bool is_first_year(int year)
  116. {
  117.     if (year == 1)
  118.         return true;
  119.     else
  120.         return false;
  121. }
  122.  
  123. std::ostream& operator<<(std::ostream& stream, const Date& date)
  124. {
  125.     int year = std::get<0>(date);
  126.     int month = std::get<1>(date);
  127.     int day = std::get<2>(date);
  128.     std::string dates = ToJapaneseEraYear(year, month, day);
  129.     return stream
  130.         << dates;
  131. }
  132.  
  133. // main.cpp
  134.  
  135. #include <iostream>
  136. #include "DateTime.hpp"
  137.  
  138.  
  139. int main()
  140. {
  141.     Date d(2019, 12, 31), d2(2020, 1, 1);
  142.     std::cout << d << std::endl;
  143.     std::cout << d2 << std::endl;
  144. }
  145.  
  146. /*
  147. 出力結果:
  148. 2019年(令和元年)12月31日
  149. 2020年(令和2年)1月1日
  150. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement