| Hongliang さん、お返事ありがとうございます。
処理が混雑していますが、何とかできたと思います。
和暦に変換する日付が、どの和暦の期間に入るかの
判定と期間の終了日がないときの判定も併せると混乱してしまします。
和暦略称が代入されたときを判定基準にしています。
・和暦期間の開始日と比較
・和暦期間の終了日と比較
比較時に和暦略称を代入したり、リセットしたりしています。
もう少しわかりやすい処理や考え方あれば、勉強したいです。
先生方はどのように処理されるのでしょうか。
<?xml version="1.0" encoding="UTF-8"?>
<wareki>
<data>
<era_name>Meiji</era_name>
<era_ryaku>M</era_ryaku>
<era_start>18680125</era_start>
<era_end>19120729</era_end>
</data>
<data>
<era_name>Taisho</era_name>
<era_ryaku>T</era_ryaku>
<era_start>19120730</era_start>
<era_end>19261224</era_end>
</data>
<data>
<era_name>Showa</era_name>
<era_ryaku>S</era_ryaku>
<era_start>19261225</era_start>
<era_end>19890107</era_end>
</data>
<data>
<era_name>Heisei</era_name>
<era_ryaku>H</era_ryaku>
<era_start>19890108</era_start>
<era_end>20190430</era_end>
</data>
<data>
<era_name>Reiwa</era_name>
<era_ryaku>R</era_ryaku>
<era_start>20190501</era_start>
<era_end></era_end>
</data>
</wareki>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
namespace ERA
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//DateTime dt = DateTime.Now;
string strTime = "1989/01/07 1:10:50";
DateTime dt = DateTime.Parse(strTime);
string era = getChangeEra(dt);
MessageBox.Show(era, "和暦変換");
}
#region 西暦から和暦に変換する
//************************************************
// 和暦の形式(R1.5月)
// 変換できない場合は空白とする
// 明治元年(1868年1月25日) 明治45年(1912年7月29日)
// 大正 元年(1912年7月30日) 15年(1926年12月24日)
// 昭和 元年(1926年12月25日) 64年(1989年1月7日)
// 平成 元年(1989年1月8日) 31年(2019年4月30日)
// 令和 元年(2019年5月1日) 未定
//************************************************
private static string getChangeEra(DateTime pDate)
{
string EraName = "";
try
{
// 日時から日付のみ取得
DateTime wdate = pDate.Date;
// XML ロード
var table = XDocument.Load(@"C:\era.xml").Element("wareki");
string era_name = "";
string era_ryaku = "";
string era_start = "";
string era_end = "";
foreach (var row in table.Elements("data"))
{
// XMLのデータをセット
era_name = row.Element("era_name").Value;
era_ryaku = row.Element("era_ryaku").Value;
era_start = row.Element("era_start").Value;
era_end = row.Element("era_end").Value;
// 開始日が空白なら読み飛ばし
if (era_start != "")
{
DateTime? e_start = null; // Null許容型
// 和暦の開始日を日付型に変換
e_start = DateTime.ParseExact(era_start, "yyyyMMdd", null);
// 日付がera_start以上なら、和暦略称を代入
if (e_start <= wdate)
{
EraName = era_ryaku;
}
else
{
EraName = "";
}
// 和暦の終了日の有無
DateTime? e_end = null; // Null許容型
if (era_end != "")
{
// 和暦の終了日を日付型に変換
e_end = DateTime.ParseExact(era_end, "yyyyMMdd", null);
// 日付がera_end以下なら、和暦略称を代入
if (e_end >= wdate)
{
EraName = era_ryaku;
}
else // 日付がera_end以上なら、和暦略称をリセット
{
EraName = "";
}
}
}
// 和暦略称が入力された場合は、繰り返し中断
if (EraName != "")
{
// 西暦から和暦の年を取得
int era_year = pDate.Year - int.Parse(era_start.Substring(0, 4)) + 1;
// 月を取得
string era_month = pDate.Month.ToString();
// 和暦へ変換
EraName = era_ryaku + era_year.ToString() + "." + era_month + "月";
break;
}
}
}
catch (FormatException)
{
EraName = "";
}
return EraName;
}
#endregion |