Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd1b2260

Browse files
committed
Add code to be able to match the timezone name on localized Windows
systems. Magnus Hagander.
1 parent0b143dd commitd1b2260

File tree

1 file changed

+108
-1
lines changed

1 file changed

+108
-1
lines changed

‎src/timezone/pgtz.c

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
77
*
88
* IDENTIFICATION
9-
* $PostgreSQL: pgsql/src/timezone/pgtz.c,v 1.24 2004/08/30 02:54:42 momjian Exp $
9+
* $PostgreSQL: pgsql/src/timezone/pgtz.c,v 1.25 2004/09/01 16:21:50 tgl Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -822,8 +822,11 @@ identify_system_timezone(void)
822822
{
823823
inti;
824824
chartzname[128];
825+
charlocaltzname[256];
825826
time_tt=time(NULL);
826827
structtm*tm=localtime(&t);
828+
HKEYrootKey;
829+
intidx;
827830

828831
if (!tm)
829832
{
@@ -846,6 +849,110 @@ identify_system_timezone(void)
846849
}
847850
}
848851

852+
/*
853+
* Localized Windows versions return localized names for the
854+
* timezone. Scan the registry to find the English name,
855+
* and then try matching against our table again.
856+
*/
857+
memset(localtzname,0,sizeof(localtzname));
858+
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
859+
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones",
860+
0,
861+
KEY_READ,
862+
&rootKey)!=ERROR_SUCCESS)
863+
{
864+
ereport(WARNING,
865+
(errmsg_internal("could not open registry key to identify Windows timezone: %i", (int)GetLastError())));
866+
returnNULL;
867+
}
868+
869+
for (idx=0; ;idx++)
870+
{
871+
charkeyname[256];
872+
charzonename[256];
873+
DWORDnamesize;
874+
FILETIMElastwrite;
875+
HKEYkey;
876+
LONGr;
877+
878+
memset(keyname,0,sizeof(keyname));
879+
namesize=sizeof(keyname);
880+
if ((r=RegEnumKeyEx(rootKey,
881+
idx,
882+
keyname,
883+
&namesize,
884+
NULL,
885+
NULL,
886+
NULL,
887+
&lastwrite))!=ERROR_SUCCESS)
888+
{
889+
if (r==ERROR_NO_MORE_ITEMS)
890+
break;
891+
ereport(WARNING,
892+
(errmsg_internal("could not enumerate registry subkeys to identify Windows timezone: %i", (int)r)));
893+
break;
894+
}
895+
896+
if ((r=RegOpenKeyEx(rootKey,keyname,0,KEY_READ,&key))!=ERROR_SUCCESS)
897+
{
898+
ereport(WARNING,
899+
(errmsg_internal("could not open registry subkey to identify Windows timezone: %i", (int)r)));
900+
break;
901+
}
902+
903+
memset(zonename,0,sizeof(zonename));
904+
namesize=sizeof(zonename);
905+
if ((r=RegQueryValueEx(key,"Std",NULL,NULL,zonename,&namesize))!=ERROR_SUCCESS)
906+
{
907+
ereport(WARNING,
908+
(errmsg_internal("could not query value for 'std' to identify Windows timezone: %i", (int)r)));
909+
RegCloseKey(key);
910+
break;
911+
}
912+
if (strcmp(tzname,zonename)==0)
913+
{
914+
/* Matched zone */
915+
strcpy(localtzname,keyname);
916+
RegCloseKey(key);
917+
break;
918+
}
919+
memset(zonename,0,sizeof(zonename));
920+
namesize=sizeof(zonename);
921+
if ((r=RegQueryValueEx(key,"Dlt",NULL,NULL,zonename,&namesize))!=ERROR_SUCCESS)
922+
{
923+
ereport(WARNING,
924+
(errmsg_internal("could not query value for 'dlt' to identify Windows timezone: %i", (int)r)));
925+
RegCloseKey(key);
926+
break;
927+
}
928+
if (strcmp(tzname,zonename)==0)
929+
{
930+
/* Matched DST zone */
931+
strcpy(localtzname,keyname);
932+
RegCloseKey(key);
933+
break;
934+
}
935+
936+
RegCloseKey(key);
937+
}
938+
939+
RegCloseKey(rootKey);
940+
941+
if (localtzname[0])
942+
{
943+
/* Found a localized name, so scan for that one too */
944+
for (i=0;win32_tzmap[i].stdname!=NULL;i++)
945+
{
946+
if (strcmp(localtzname,win32_tzmap[i].stdname)==0||
947+
strcmp(localtzname,win32_tzmap[i].dstname)==0)
948+
{
949+
elog(DEBUG4,"TZ \"%s\" matches localized Windows timezone \"%s\" (\"%s\")",
950+
win32_tzmap[i].pgtzname,tzname,localtzname);
951+
returnwin32_tzmap[i].pgtzname;
952+
}
953+
}
954+
}
955+
849956
ereport(WARNING,
850957
(errmsg("could not find a match for Windows timezone \"%s\"",
851958
tzname)));

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp