none
和暦のアルファベット頭文字の取得 RRS feed

  • 質問

  • VC++2010で開発。

    GetDateFormatEx関数を使用して、
    西暦から和暦を取得しているのですが、元号は「平成」の2文字で取得されます。

    これを、アルファベットでの頭文字「H」で取得したいのですが、可能でしょうか?


    2019年2月7日 6:37

回答

  • 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
    2019年2月7日 11:19
  • 当該レジストリが導入されたのはWindows 7 SP1です。
    • 回答としてマーク Brillia 2019年2月8日 0:40
    2019年2月7日 12:14
  • 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
    2019年2月8日 1:46

すべての返信

  • 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
    2019年2月7日 11:19
  • 当該レジストリが導入されたのはWindows 7 SP1です。
    • 回答としてマーク Brillia 2019年2月8日 0:40
    2019年2月7日 12:14
  • 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
    2019年2月8日 1:46
  • コードで書くとこんな感じかな?(レジストリには過去と同じ元号が登場しないことが前提です)

    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

    2019年2月10日 8:43