元号の追加方法まとめ
をテンプレートにして作成
[
Front page
] [
Page list
|
Search
|
Recent changes
|
RSS of recent changes
]
Start:
*WindowsXP [#s7252c5b]
''C:\Windows\System32\locale.nls''~
0x03F8F0あたりに元号の定義があるみたいなので追加。
|>|月|>|日|>|年 |? |? |>|>|>|>|>|>|>|年(文字列)|>|\0 ...
|01|00|01|00|E4|07|0C|00|32|00|30|00|32|00|30|00|00|00|7D...
|>|1 |>|1 |>|2020 |? |? |>|2 |>|0 |>|2 |>|0 |>|\0 |>...
ちなみに平成はこのような感じになっている。
|>|月|>|日|>|年 |? |? |>|>|>|>|>|>|>|年(文字列)|>|\0 ...
|01|00|08|00|C5|07|0C|00|31|00|39|00|38|00|39|00|00|00|73...
|>|1 |>|8 |>|1989 |? |? |>|1 |>|9 |>|8 |>|9 |>|\0 |>|...
ほかにアドレス長かジャンプテーブルの箇所があるはずだが見...
*Windows7〜 [#hd40ab1d]
以下のレジストリに元号を追加する。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\...
"1868 01 01"="明治_明_Meiji_M"
"1912 07 30"="大正_大_Taisho_T"
"1926 12 25"="昭和_昭_Showa_S"
"1989 01 08"="平成_平_Heisei_H"
https://msdn.microsoft.com/ja-jp/library/windows/desktop/...
*.Net Framework2〜3.5 [#c0e71e3e]
OSに依存(XPの場合はlocale.nls、7の場合は未確認)。~
Windows7/.Net3.5の場合は、上記Windows7のレジストリに元号...
しかし、OS側が対応できない場合は、リフレクションを使い力...
***突然ですがコードです。 [#s69515b1]
private void UpdateJapaneseEra (DateTimeFormatInfo dateT...
if (System.Environment.Version.Major >= 4) {return;}
var len = NewEraInfoParameter.GetLength(0);
string[] new_EraNames = new string[len];
string[] new_AbbrevEraNames = new string[len];
string[] new_AbbrevEnglishEraNames = new string[len];
for (int i = len-1; i >= 0; i--) {
new_EraNames[i] = (string)NewEraInfoParameter.Ge...
new_AbbrevEraNames[i] = (string)NewEraInfoParamet...
new_AbbrevEnglishEraNames[i] = (string)NewEraInfo...
}
Type dateTimeFormatInfoType = dateTimeFormatInfo.GetT...
FieldInfo eraNamesFieldInfo = dateTimeFormatInfoType....
...
...
eraNamesFieldInfo.SetValue(dateTimeFormatInfo, new_Er...
FieldInfo abbrevEraNamesFieldInfo = dateTimeFormatInf...
...
...
abbrevEraNamesFieldInfo.SetValue(dateTimeFormatInfo, ...
FieldInfo abbrevEnglishEraNamesFieldInfo = dateTimeFo...
...
...
abbrevEnglishEraNamesFieldInfo.SetValue(dateTimeForma...
}
private void UpdateJapaneseEra (JapaneseCalendar japanes...
if (System.Environment.Version.Major >= 4) {return;}
Type japaneseCalendarType = japaneseCalendar.GetType();
FieldInfo helperFieldInfo = japaneseCalendarType.GetF...
...
...
object helper = helperFieldInfo.GetValue(japaneseCale...
Type helperType = helper.GetType();
FieldInfo eraInfoFieldInfo = helperType.GetField("m_E...
...
...
Array eraInfo = (Array)eraInfoFieldInfo.GetValue(help...
Type eraInfoType = eraInfo.GetValue(0).GetType();
int len = NewEraInfoParameter.GetLength(0);
Array new_EraInfo = Array.CreateInstance(eraInfoType,...
int[] new_eras = new int[len];
// Build parameters
int n = 0;
int minYear = 1;
int maxYear = 9999;
for (int i = NewEraInfoParameter.GetLength(0)-1; i >=...
int Year = (int)NewEraInfoParameter.GetValue(i, 3);
int Month = (int)NewEraInfoParameter.GetValue(i, ...
int Day = (int)NewEraInfoParameter.GetValue(i, 5);
if (n == 0) {
maxYear = 9999 - Year - 1;
} else {
maxYear = (int)NewEraInfoParameter.GetValue(i...
}
new_EraInfo.SetValue(eraInfoType.Assembly.CreateI...
...
...
...
...
...
...
...
...
...
...
, n);
new_eras[i] = len - i;
n++;
}
eraInfoFieldInfo.SetValue(helper, new_EraInfo);
/*
FieldInfo eraInfoFieldInfo2 = japaneseCalendarType.Ge...
...
...
eraInfoFieldInfo2.SetValue(japaneseCalendar, new_EraI...
*/
FieldInfo erasFieldInfo = helperType.GetField("m_eras...
...
...
erasFieldInfo.SetValue(helper, new_eras);
}
この2つでJapaneseCalendarとDateTimeFormatInfoに元号を追加...
private CultureInfo GetJapaneseCultureInfo () {
var eras = new object[,] {
{"明治", "明", "M", 1868, 01, 01},
{"大正", "大", "T", 1912, 07, 30},
{"昭和", "昭", "S", 1926, 12, 25},
{"平成", "平", "H", 1989, 01, 09},
{"楽珍", "楽", "R", 2020, 01, 01}};
var curinfo = new CultureInfo("ja-JP");
var cal = new JapaneseCalendar();
UpdateJapaneseEra(cal, eras);
curinfo.DateTimeFormat.Calendar = cal;
//DateTimeFormat.Calenderにカレンダーをセットした後に...
UpdateJapaneseEra(curinfo.DateTimeFormat, eras);
return curinfo;
}
使ってみると、
var culinfo = GetJapaneseCultureInfo();
System.Diagnostics.Debug.Print(new DateTime(2019, 12, 31...
System.Diagnostics.Debug.Print(new DateTime(2020, 01, 01...
出力
平成 31/12/31 0:00:00
楽珍 1/1/1 0:00:00
*.Net Framework4〜 [#c1ac91b4]
OSに依存(レジストリの設定)。
*Microsoft Office [#w84e4e17]
***2003 (Word, VBA) [#z44ef34f]
2003の場合、''C:\Program Files\Common Files\Microsoft Sha...
*Tcl8.4 [#j8f4d725]
そもそも元号表示できません。
*Tcl8.5〜 [#td5035ab]
lib/tcl8.5/msgs/ja.msg を修正する。
::msgcat::mcset ja LOCALE_ERAS
の値に新元号を追加する。この値はunicodeでエスケープされて...
{-9223372036854775808 西暦 0}
{-3061011600 明治 1867}
{-1812186000 大正 1911}
{-1357635600 昭和 1925}
{ 600220800 平成 1988}
リストの最初の数値は1970年1月1日からのepoch timeで、''clo...
::msgcat::mcset ja LOCALE_ERAS "\u007b-92233720368547...
\u660e\u6cbb 1867\u007d \u007b-1812186000 \u5927\u6b6...
1925\u007d \u007b600220800 \u5e73\u6210 1988\u007d \u...
使ってみると、こんな感じ。
tclsh86
% clock format [clock seconds] -format %Ex -locale ja
平成28年07月14日
% clock format [clock scan 2019-12-31] -format %Ex -loca...
平成31年12月31日
% clock format [clock scan 2020-01-01] -format %Ex -loca...
楽珍01年01月01日
http://www.tcl-lang.org/cgi-bin/tct/tip/173.txt
End:
*WindowsXP [#s7252c5b]
''C:\Windows\System32\locale.nls''~
0x03F8F0あたりに元号の定義があるみたいなので追加。
|>|月|>|日|>|年 |? |? |>|>|>|>|>|>|>|年(文字列)|>|\0 ...
|01|00|01|00|E4|07|0C|00|32|00|30|00|32|00|30|00|00|00|7D...
|>|1 |>|1 |>|2020 |? |? |>|2 |>|0 |>|2 |>|0 |>|\0 |>...
ちなみに平成はこのような感じになっている。
|>|月|>|日|>|年 |? |? |>|>|>|>|>|>|>|年(文字列)|>|\0 ...
|01|00|08|00|C5|07|0C|00|31|00|39|00|38|00|39|00|00|00|73...
|>|1 |>|8 |>|1989 |? |? |>|1 |>|9 |>|8 |>|9 |>|\0 |>|...
ほかにアドレス長かジャンプテーブルの箇所があるはずだが見...
*Windows7〜 [#hd40ab1d]
以下のレジストリに元号を追加する。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\...
"1868 01 01"="明治_明_Meiji_M"
"1912 07 30"="大正_大_Taisho_T"
"1926 12 25"="昭和_昭_Showa_S"
"1989 01 08"="平成_平_Heisei_H"
https://msdn.microsoft.com/ja-jp/library/windows/desktop/...
*.Net Framework2〜3.5 [#c0e71e3e]
OSに依存(XPの場合はlocale.nls、7の場合は未確認)。~
Windows7/.Net3.5の場合は、上記Windows7のレジストリに元号...
しかし、OS側が対応できない場合は、リフレクションを使い力...
***突然ですがコードです。 [#s69515b1]
private void UpdateJapaneseEra (DateTimeFormatInfo dateT...
if (System.Environment.Version.Major >= 4) {return;}
var len = NewEraInfoParameter.GetLength(0);
string[] new_EraNames = new string[len];
string[] new_AbbrevEraNames = new string[len];
string[] new_AbbrevEnglishEraNames = new string[len];
for (int i = len-1; i >= 0; i--) {
new_EraNames[i] = (string)NewEraInfoParameter.Ge...
new_AbbrevEraNames[i] = (string)NewEraInfoParamet...
new_AbbrevEnglishEraNames[i] = (string)NewEraInfo...
}
Type dateTimeFormatInfoType = dateTimeFormatInfo.GetT...
FieldInfo eraNamesFieldInfo = dateTimeFormatInfoType....
...
...
eraNamesFieldInfo.SetValue(dateTimeFormatInfo, new_Er...
FieldInfo abbrevEraNamesFieldInfo = dateTimeFormatInf...
...
...
abbrevEraNamesFieldInfo.SetValue(dateTimeFormatInfo, ...
FieldInfo abbrevEnglishEraNamesFieldInfo = dateTimeFo...
...
...
abbrevEnglishEraNamesFieldInfo.SetValue(dateTimeForma...
}
private void UpdateJapaneseEra (JapaneseCalendar japanes...
if (System.Environment.Version.Major >= 4) {return;}
Type japaneseCalendarType = japaneseCalendar.GetType();
FieldInfo helperFieldInfo = japaneseCalendarType.GetF...
...
...
object helper = helperFieldInfo.GetValue(japaneseCale...
Type helperType = helper.GetType();
FieldInfo eraInfoFieldInfo = helperType.GetField("m_E...
...
...
Array eraInfo = (Array)eraInfoFieldInfo.GetValue(help...
Type eraInfoType = eraInfo.GetValue(0).GetType();
int len = NewEraInfoParameter.GetLength(0);
Array new_EraInfo = Array.CreateInstance(eraInfoType,...
int[] new_eras = new int[len];
// Build parameters
int n = 0;
int minYear = 1;
int maxYear = 9999;
for (int i = NewEraInfoParameter.GetLength(0)-1; i >=...
int Year = (int)NewEraInfoParameter.GetValue(i, 3);
int Month = (int)NewEraInfoParameter.GetValue(i, ...
int Day = (int)NewEraInfoParameter.GetValue(i, 5);
if (n == 0) {
maxYear = 9999 - Year - 1;
} else {
maxYear = (int)NewEraInfoParameter.GetValue(i...
}
new_EraInfo.SetValue(eraInfoType.Assembly.CreateI...
...
...
...
...
...
...
...
...
...
...
, n);
new_eras[i] = len - i;
n++;
}
eraInfoFieldInfo.SetValue(helper, new_EraInfo);
/*
FieldInfo eraInfoFieldInfo2 = japaneseCalendarType.Ge...
...
...
eraInfoFieldInfo2.SetValue(japaneseCalendar, new_EraI...
*/
FieldInfo erasFieldInfo = helperType.GetField("m_eras...
...
...
erasFieldInfo.SetValue(helper, new_eras);
}
この2つでJapaneseCalendarとDateTimeFormatInfoに元号を追加...
private CultureInfo GetJapaneseCultureInfo () {
var eras = new object[,] {
{"明治", "明", "M", 1868, 01, 01},
{"大正", "大", "T", 1912, 07, 30},
{"昭和", "昭", "S", 1926, 12, 25},
{"平成", "平", "H", 1989, 01, 09},
{"楽珍", "楽", "R", 2020, 01, 01}};
var curinfo = new CultureInfo("ja-JP");
var cal = new JapaneseCalendar();
UpdateJapaneseEra(cal, eras);
curinfo.DateTimeFormat.Calendar = cal;
//DateTimeFormat.Calenderにカレンダーをセットした後に...
UpdateJapaneseEra(curinfo.DateTimeFormat, eras);
return curinfo;
}
使ってみると、
var culinfo = GetJapaneseCultureInfo();
System.Diagnostics.Debug.Print(new DateTime(2019, 12, 31...
System.Diagnostics.Debug.Print(new DateTime(2020, 01, 01...
出力
平成 31/12/31 0:00:00
楽珍 1/1/1 0:00:00
*.Net Framework4〜 [#c1ac91b4]
OSに依存(レジストリの設定)。
*Microsoft Office [#w84e4e17]
***2003 (Word, VBA) [#z44ef34f]
2003の場合、''C:\Program Files\Common Files\Microsoft Sha...
*Tcl8.4 [#j8f4d725]
そもそも元号表示できません。
*Tcl8.5〜 [#td5035ab]
lib/tcl8.5/msgs/ja.msg を修正する。
::msgcat::mcset ja LOCALE_ERAS
の値に新元号を追加する。この値はunicodeでエスケープされて...
{-9223372036854775808 西暦 0}
{-3061011600 明治 1867}
{-1812186000 大正 1911}
{-1357635600 昭和 1925}
{ 600220800 平成 1988}
リストの最初の数値は1970年1月1日からのepoch timeで、''clo...
::msgcat::mcset ja LOCALE_ERAS "\u007b-92233720368547...
\u660e\u6cbb 1867\u007d \u007b-1812186000 \u5927\u6b6...
1925\u007d \u007b600220800 \u5e73\u6210 1988\u007d \u...
使ってみると、こんな感じ。
tclsh86
% clock format [clock seconds] -format %Ex -locale ja
平成28年07月14日
% clock format [clock scan 2019-12-31] -format %Ex -loca...
平成31年12月31日
% clock format [clock scan 2020-01-01] -format %Ex -loca...
楽珍01年01月01日
http://www.tcl-lang.org/cgi-bin/tct/tip/173.txt
Page:
HTML convert time: 0.003 sec.