トップ回答者
和暦のアルファベット頭文字の取得

質問
回答
-
Brillia さん、
GetDateFormatEx 関数への回答ではなく、また、Windows のバージョンに依存するお話で申し訳ありませんが・・・
Windows 10 April 2018 Update 以降ならレジストリーを参照すれば「H」を取得することができます。
レジストリーの次のところに和暦の情報があります。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras
次はテストを兼ねて、当該キーに江戸時代の和暦を追加した画像です。
(Windows バージョン 1809, ビルド 17763.253)
推測できるとおり、当該元号の開始年月日をキーにして、データ部に漢字の元号_略号_ローマ字表記があります。
ローマ字表記の先頭1文字が "H" とか "S" になります(末尾1文字を取得するほうが楽です・・・)。
この情報は 新元号プレースホルダーのレジストリを個別に削除、追加する方法について で説明されています。
他用があるので、Windows 10 April 2018 Update 以前での元号取得については、後日調べて、分かればご報告いたします。
差し支えなければ、ターゲットとされている OS の種類とバージョンをお知らせください。
以上です。
Ashidacchi -- https://ssl01.rocketnet.jp/hokusosha.com/default.html
- 編集済み Ashidacchi 2019年2月7日 11:23
- 回答としてマーク Brillia 2019年2月8日 0:40
-
Brillia さん、
いずれも仮想マシンですが、Windows 7 および 8.1 のレジストリーを見てみました。
Windows 7 の各エディション(いずれも 64-bit 版):
Home、Pro および Ultimate: Nis キーがあり、Windows 10 と同様に元号が取得できます。Windows 8.1 Pro(64-bit)では、Nsi キーがあり、元号を取得できます。
もし、レジストリーから元号(アルファベット)を取得なさるなら、
ターゲットとされるPCについて事前に確認なさることをお勧めいたします。
以上です。
追伸: 最初に投稿した内容に誤りがありましたので訂正しました。
Win. 7 Home ではキーが見つからないと書いていましたが、勘違いでした・・・ <m(__)m>
Ashidacchi -- https://ssl01.rocketnet.jp/hokusosha.com/default.html
- 編集済み Ashidacchi 2019年2月8日 1:52
- 回答としてマーク Brillia 2019年2月8日 5:47
すべての返信
-
Brillia さん、
GetDateFormatEx 関数への回答ではなく、また、Windows のバージョンに依存するお話で申し訳ありませんが・・・
Windows 10 April 2018 Update 以降ならレジストリーを参照すれば「H」を取得することができます。
レジストリーの次のところに和暦の情報があります。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras
次はテストを兼ねて、当該キーに江戸時代の和暦を追加した画像です。
(Windows バージョン 1809, ビルド 17763.253)
推測できるとおり、当該元号の開始年月日をキーにして、データ部に漢字の元号_略号_ローマ字表記があります。
ローマ字表記の先頭1文字が "H" とか "S" になります(末尾1文字を取得するほうが楽です・・・)。
この情報は 新元号プレースホルダーのレジストリを個別に削除、追加する方法について で説明されています。
他用があるので、Windows 10 April 2018 Update 以前での元号取得については、後日調べて、分かればご報告いたします。
差し支えなければ、ターゲットとされている OS の種類とバージョンをお知らせください。
以上です。
Ashidacchi -- https://ssl01.rocketnet.jp/hokusosha.com/default.html
- 編集済み Ashidacchi 2019年2月7日 11:23
- 回答としてマーク Brillia 2019年2月8日 0:40
-
Brillia さん、
いずれも仮想マシンですが、Windows 7 および 8.1 のレジストリーを見てみました。
Windows 7 の各エディション(いずれも 64-bit 版):
Home、Pro および Ultimate: Nis キーがあり、Windows 10 と同様に元号が取得できます。Windows 8.1 Pro(64-bit)では、Nsi キーがあり、元号を取得できます。
もし、レジストリーから元号(アルファベット)を取得なさるなら、
ターゲットとされるPCについて事前に確認なさることをお勧めいたします。
以上です。
追伸: 最初に投稿した内容に誤りがありましたので訂正しました。
Win. 7 Home ではキーが見つからないと書いていましたが、勘違いでした・・・ <m(__)m>
Ashidacchi -- https://ssl01.rocketnet.jp/hokusosha.com/default.html
- 編集済み Ashidacchi 2019年2月8日 1:52
- 回答としてマーク Brillia 2019年2月8日 5:47
-
コードで書くとこんな感じかな?(レジストリには過去と同じ元号が登場しないことが前提です)
BOOL GetEraAlphabet(const LPSYSTEMTIME lpSystemTime, LPWSTR lpszEraAlphabet, DWORD dwEraAlphabetSize) { BOOL bRet = FALSE; WCHAR szEra[256] = { 0 }; if (GetDateFormatEx(L"ja-JP", DATE_USE_ALT_CALENDAR, lpSystemTime, L"gg", szEra, _countof(szEra), NULL) > 0) { HKEY hKey; if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Nls\\Calendars\\Japanese\\Eras", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { DWORD dwValues; if (RegQueryInfoKeyW(hKey, 0, 0, 0, 0, 0, 0, &dwValues, 0, 0, 0, 0) == ERROR_SUCCESS) { for (DWORD i = 0; i < dwValues; ++i) { WCHAR szValueName[1024] = { 0 }; DWORD dwValueNameSize = _countof(szValueName); WCHAR szData[1024]; DWORD dwDataByteSize = sizeof(szData); if (RegEnumValueW(hKey, i, szValueName, &dwValueNameSize, 0, 0, (LPBYTE)szData, &dwDataByteSize) == ERROR_SUCCESS) { if (wcsncmp(szData, szEra, lstrlenW(szEra)) == 0) { LPWSTR context = 0; LPWSTR p = wcstok_s(szData, L"_", &context); for (int i = 0; i < 3 && p; ++i) { p = wcstok_s(0, L"_", &context); } if (p) { lstrcpynW(lpszEraAlphabet, p, dwEraAlphabetSize); bRet = TRUE; } break; } } } } RegCloseKey(hKey); } } return bRet; }
https://gist.github.com/kenjinote/07fd7cbe39fda83d1a9d7180ca0981b6