关于SetLocaleInfo()

简介: 原文:关于SetLocaleInfo()此函数用于设置系统的一些本地信息, 非常有用. 比如日期格式为'yyyy/mm/dd'时, 稍微不注意,有些程序语句会报错. 以下资料网络收集: 1. SetLocaleInfo()中 LCTYPE values 的具体意义    出自: http://hi.
原文: 关于SetLocaleInfo()

此函数用于设置系统的一些本地信息, 非常有用.

比如日期格式为'yyyy/mm/dd'时, 稍微不注意,有些程序语句会报错.

以下资料网络收集:

1. SetLocaleInfo()中 LCTYPE values 的具体意义

   出自: http://hi.baidu.com/stormsxf/blog/item/7395b3000ed2e015728b65a5.html

BOOL SetLocaleInfo(
LCID Locale,
LCTYPE LCType,
LPWTSTR lpLCData
);

其中LCTYPE LCType参数的具体意义如下

Public:

CONSTANT Long LOCALE_SCURRENCY = 20 //本地语言货币符号
CONSTANT Long LOCALE_SINTLSYMBOL = 21 //国际货币符号
CONSTANT Long LOCALE_SMONDECIMALSEP = 22 //小数分隔符
CONSTANT Long LOCALE_SMONTHOUSANDSEP = 23 //千位分隔符
CONSTANT Long LOCALE_SMONGROUPING = 24 //数据分组方式
CONSTANT Long LOCALE_ICURRDIGITS = 25 //# 本地数字
CONSTANT Long LOCALE_IINTLCURRDIGITS = 26 //# 国际数字
CONSTANT Long LOCALE_ICURRENCY = 27 //货币正数表示模式
CONSTANT Long LOCALE_INEGCURR = 28 //货币负数表示模式

CONSTANT Long LOCALE_IPOSSIGNPOSN = 82 //货币正数符号的位置
CONSTANT Long LOCALE_INEGSIGNPOSN = 83 //货币负数符号的位置
CONSTANT Long LOCALE_IPOSSYMPRECEDES = 84 //正数中,货币符号位于值之前
CONSTANT Long LOCALE_IPOSSEPBYSPACE = 85 //正数中,货币符号与值之间被空格分开
CONSTANT Long LOCALE_INEGSYMPRECEDES = 86 //负数中,货币符号位于值之前
CONSTANT Long LOCALE_INEGSEPBYSPACE = 87 //负数中,货币符号与值之间被空格分开
CONSTANT Long LOCALE_FONTSIGNATURE = 88 //font signature

CONSTANT Long LOCALE_SENGCURRNAME = 4103 //货币的英语名称
CONSTANT Long LOCALE_SNATIVECURRNAME = 4104 //货币的当地语言名称

CONSTANT Long LOCALE_ILANGUAGE = 1 //语言ID
CONSTANT Long LOCALE_SLANGUAGE = 2 //语言区域名称
CONSTANT Long LOCALE_SENGLANGUAGE = 4097 //语言英语名称
CONSTANT Long LOCALE_SABBREVLANGNAME = 3 //语言名称缩写
CONSTANT Long LOCALE_SNATIVELANGNAME = 4 //当地语言名称
CONSTANT Long LOCALE_ICOUNTRY = 5 //国家代码
CONSTANT Long LOCALE_SCOUNTRY = 6 //国家本地名称
CONSTANT Long LOCALE_SENGCOUNTRY = 4098 //国家英语名称
CONSTANT Long LOCALE_SABBREVCTRYNAME = 7 //国家名称缩写
CONSTANT Long LOCALE_SNATIVECTRYNAME = 8 //当地语言国家名称
CONSTANT Long LOCALE_IDEFAULTLANGUAGE = 9 //缺省语言ID
CONSTANT Long LOCALE_IDEFAULTCOUNTRY = 10 //缺省国家代码
CONSTANT Long LOCALE_IDEFAULTCODEPAGE = 11 //缺省的OEM代码
CONSTANT Long LOCALE_SLIST = 12 //list item separator
CONSTANT Long LOCALE_IDEFAULTANSICODEPAGE = 4100 //缺省的ASCII代码
CONSTANT Long LOCALE_IDEFAULTMACCODEPAGE = 4113 //缺省的MACINTOH代码
CONSTANT Long LOCALE_IMEASURE = 13 //0 = 公制, 1 = 美制
CONSTANT Long LOCALE_SDECIMAL = 14 //decimal separator
CONSTANT Long LOCALE_STHOUSAND = 15 //thousand separator
CONSTANT Long LOCALE_SGROUPING = 16 //digit grouping
CONSTANT Long LOCALE_IDIGITS = 17 //number of fractional digits
CONSTANT Long LOCALE_ILZERO = 18 //leading zeros for decimal
CONSTANT Long LOCALE_SNATIVEDIGITS = 19 //native ascii 0-9


//Windows NT 4.0/2000/XP
CONSTANT Long LOCALE_SISO639LANGNAME = 89 //ISO 语言缩写名称
CONSTANT Long LOCALE_SISO3166CTRYNAME = 90 //ISO 国家缩写名称
//Windows 2000/XP
CONSTANT Long LOCALE_IDEFAULTEBCDICCODEPAGE = 4114 //缺省的EBCDIC代码
CONSTANT Long LOCALE_SSORTNAME = 4115 //排序名称

CONSTANT Long LOCALE_INEGNUMBER = 4112 //negative number mode

CONSTANT Long LOCALE_SDATE = 29 //日期分隔符
CONSTANT Long LOCALE_STIME = 30 //时间风隔符
CONSTANT Long LOCALE_SSHORTDATE = 31 //短日期格式
CONSTANT Long LOCALE_SLONGDATE = 32 //长日期格式
CONSTANT Long LOCALE_STIMEFORMAT = 4009 //时间格式
CONSTANT Long LOCALE_IDATE = 33 //短日期格式的排列顺序
CONSTANT Long LOCALE_ILDATE = 34 //长日期格式的排列顺序
CONSTANT Long LOCALE_ITIME = 35 //时间格式标示符号
CONSTANT Long LOCALE_ITIMEMARKPOSN = 4011 //时间标记符位置
CONSTANT Long LOCALE_ICENTURY = 36 //世纪识别符 (短日期)
CONSTANT Long LOCALE_ITLZERO = 37 //时间数字前面前导0
CONSTANT Long LOCALE_IDAYLZERO = 38 //日期数字前面前导0 (短日期)
CONSTANT Long LOCALE_IMONLZERO = 39 //月份数字前面前导0 (短日期)
CONSTANT Long LOCALE_S1159 = 40 //AM 指示符
CONSTANT Long LOCALE_S2359 = 41 //PM 指示符
CONSTANT Long LOCALE_ICALENDARTYPE = 4105 //日历类型指示符
CONSTANT Long LOCALE_IPAPERSIZE = 4106 //0 = letter, 1 = a4, 2 = legal, 3 = a3
CONSTANT Long LOCALE_IOPTIONALCALENDAR = 4107 //其它日历类型指示符
CONSTANT Long LOCALE_IFIRSTDAYOFWEEK = 4108 //一周中的第一天指示符
CONSTANT Long LOCALE_IFIRSTWEEKOFYEAR = 4109 //一年中的第一周指示符
CONSTANT Long LOCALE_SDAYNAME1 = 42 //星期一的长名称
CONSTANT Long LOCALE_SDAYNAME2 = 43 //星期二的长名称
CONSTANT Long LOCALE_SDAYNAME3 = 44 //星期三的长名称
CONSTANT Long LOCALE_SDAYNAME4 = 45 //星期四的长名称
CONSTANT Long LOCALE_SDAYNAME5 = 46 //星期五的长名称
CONSTANT Long LOCALE_SDAYNAME6 = 47 //星期六的长名称
CONSTANT Long LOCALE_SDAYNAME7 = 48 //星期天的长名称
CONSTANT Long LOCALE_SABBREVDAYNAME1 = 49 //星期一的缩写名称
CONSTANT Long LOCALE_SABBREVDAYNAME2 = 50 //星期二的缩写名称
CONSTANT Long LOCALE_SABBREVDAYNAME3 = 51 //星期三的缩写名称
CONSTANT Long LOCALE_SABBREVDAYNAME4 = 52 //星期四的缩写名称
CONSTANT Long LOCALE_SABBREVDAYNAME5 = 53 //星期五的缩写名称
CONSTANT Long LOCALE_SABBREVDAYNAME6 = 54 //星期六的缩写名称
CONSTANT Long LOCALE_SABBREVDAYNAME7 = 55 //星期日的缩写名称
CONSTANT Long LOCALE_SMONTHNAME1 = 56 //一月的长名称
CONSTANT Long LOCALE_SMONTHNAME2 = 57 //二月的长名称
CONSTANT Long LOCALE_SMONTHNAME3 = 58 //三月的长名称
CONSTANT Long LOCALE_SMONTHNAME4 = 59 //四月的长名称
CONSTANT Long LOCALE_SMONTHNAME5 = 60 //五月的长名称
CONSTANT Long LOCALE_SMONTHNAME6 = 61 //六月的长名称
CONSTANT Long LOCALE_SMONTHNAME7 = 62 //七月的长名称
CONSTANT Long LOCALE_SMONTHNAME8 = 63 //八月的长名称
CONSTANT Long LOCALE_SMONTHNAME9 = 64 //九月的长名称
CONSTANT Long LOCALE_SMONTHNAME10 = 65 //十月的长名称
CONSTANT Long LOCALE_SMONTHNAME11 = 66 //十一月的长名称
CONSTANT Long LOCALE_SMONTHNAME12 = 67 //十二月的长名称
CONSTANT Long LOCALE_SMONTHNAME13 = 4110 //十三月的长名称 (如果存在)
CONSTANT Long LOCALE_SABBREVMONTHNAME1 = 68 //一月的缩写名称
CONSTANT Long LOCALE_SABBREVMONTHNAME2 = 69 //二月的缩写名称
CONSTANT Long LOCALE_SABBREVMONTHNAME3 = 70 //三月的缩写名称
CONSTANT Long LOCALE_SABBREVMONTHNAME4 = 71 //四月的缩写名称
CONSTANT Long LOCALE_SABBREVMONTHNAME5 = 72 //五月的缩写名称
CONSTANT Long LOCALE_SABBREVMONTHNAME6 = 73 //六月的缩写名称
CONSTANT Long LOCALE_SABBREVMONTHNAME7 = 74 //七月的缩写名称
CONSTANT Long LOCALE_SABBREVMONTHNAME8 = 75 //八月的缩写名称
CONSTANT Long LOCALE_SABBREVMONTHNAME9 = 76 //九月的缩写名称
CONSTANT Long LOCALE_SABBREVMONTHNAME10 = 77 //十月的缩写名称
CONSTANT Long LOCALE_SABBREVMONTHNAME11 = 78 //十一月的缩写名称
CONSTANT Long LOCALE_SABBREVMONTHNAME12 = 79 //十二月的缩写名称
CONSTANT Long LOCALE_SABBREVMONTHNAME13 = 4111 //十三月的缩写名称 (如果存在)
CONSTANT Long LOCALE_SPOSITIVESIGN = 80 //positive sign
CONSTANT Long LOCALE_SNEGATIVESIGN = 81 //negative sign

CONSTANT Long LOCALE_SYEARMONTH = 4102 //year month format string
CONSTANT Long LOCALE_IDIGITSUBSTITUTION = 4116 //0 = none, 1 = context, 2 = native digit

 

2. Delphi获得与设置系统时间格式

  出自: http://www.cnblogs.com/mingdep/archive/2012/1/1.html

在Delphi中,特别是在写管理系统软件时,经常要用到 FormatDateTime 以将 TDateTime 格式的日期时间转换成字符串形式的值显示或保存起来,或者用 StrToDateTime将字符串形式的日期时间转换成 TDateTime 然后再做其他操作。
在进行时间或日期的转换时,会使用系统当前设定的时间日期格式。而如果时间日期格式与字符串中的表示方式不相符,会使转换过程失败。例如当前短日期格式设定为'yyyy/MM/dd',而要转为 '2006-10-20'这样的字符串为日期,就会报错,说这不是一个有效的日期。
所以在进行转换前,要确保系统的日期时间格式与程序中使用的相符。一种方法是在安装时由安装程序设置,或者明确告诉用户必须设置成要求格式。另一种就是程序在启动时,自动设定为需要的格式,退出程序时再恢复原来的设置。


需要用到的有两个Windows API,一个是 GetLocaleInfo,一个是 SetLocaleInfo

查API说明:
int GetLocaleInfo(
LCID Locale, // locale identifier ,设置信息的范围,是系统级,还是当前用户
LCTYPE LCType, // type of information,设置信息的类型
LPTSTR lpLCData, // address of buffer for information,设置成的值,必须用 pchar的格式传进去
int cchData // size of buffer
);

BOOL SetLocaleInfo(
LCID Locale, // locale identifier,同上
LCTYPE LCType, // type of information to set
LPCTSTR lpLCData // pointer to information to set
);

两个函数的参数很类似,其中 Locale可以取两个值:LOCALE_SYSTEM_DEFAULT,表示要操作的是系统默认的设置; LOCALE_USER_DEFAULT,表示要操作的是当前用户的设置。还可以取其他值,用于具体修改某种语言区域的设置。一般取 LOCALE_USER_DEFAULT。
LCType,表示要操作信息的类型,也就是要操作的是哪一种设置。可用的值有很多,Delphi的联机帮助,或者查MSDN,都有一个大列表。但跟日期时间格式相关的一共有这几个:
LOCALE_SSHORTDATE :短日期格式
LOCALE_SLONGDATE :长日期格式
LOCALE_STIMEFORMAT:时间格式
另外 LOCALE_STIME 表示时间分隔符,LOCALE_SDATE 表示日期分隔符。可以单独使用,也可以在使用 LOCALE_SSHORTDATE 和 LOCALE_STIMEFORMAT 的同时一并修改,所以不需要单独操作。
使用GetLocaleInfo或SetLocaleInfo时,每次只能操作一个类型。比如要同时设置短日期格式、长日期格式、时间格式,就必须分别用三个类型代号调用三次 SetLocaleInfo。
还要一个要注意的问题是,设置日期时间格式后,应该向当前系统的激活窗口广播发送 WM_SETTINGCHANGE 消息,否则即使修改了,程序里还是不能用的。
以下是获取和设置的程序片断。

1.//获取时间日期格式

procedure GetDateTimeFormat();
var
buf:pchar;
i:integer;
GPrevShortDate,GPrevLongDate,GPrevTimeFormat:string;
begin
getmem(buf,100);
i:=100; //i必须在调用前赋值为buf缓冲区的长度。如果设为0或负值,将取不到设置的值
GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SSHORTDATE,buf,i); //取当前用户设置,短日期格式。
GPrevShortDate:=string(buf);
i:=100;
GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SLONGDATE,buf,i); //取长日期格式
GPrevLongDate:=string(buf);
i:=100;
GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_STIMEFORMAT,buf,i); //取时间格式
GPrevTimeFormat:=string(buf);
FreeMem(buf);
end;
2.//设置时间格式

procedure SetDateTimeFormat();
var
p:DWORD;
begin
SetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SSHORTDATE,pchar('yyyy-MM-dd')); //短日期
SetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SLONGDATE,pchar('yyyy''年''M''月 ''d''日'''));
SetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_STIMEFORMAT,pchar('H:mm:ss')); //设置时间
SendMessageTimeOut(HWND_BROADCAST,WM_SETTINGCHANGE,0,0,SMTO_ABORTIFHUNG,10,p);
//设置完成后必须调用,通知其他程序格式已经更改,否则即使是程序自身也不能使用新设置的格式
end;

在程序初始化时调用GetDateTimeFormat,将取出的设置保存起来,然后用SetDateTimeFormat设置需要的格式。在程序退出时再次调用SetDateTimeFormat将保存的值写回去。

 

简捷安防 欢迎试用
http://www.jianjiesoft.com
网络矩阵/视频监控平台

目录
相关文章
|
7月前
|
存储 前端开发 数据库
electron项目中使用本地数据库sqlite3和sequelize框架
electron项目中使用本地数据库sqlite3和sequelize框架
|
Linux 数据安全/隐私保护 Windows
|
8月前
|
C# 容器
WPF技术之GroupBox控件
WPF GroupBox控件是一个用于将相关控件进行分组的容器控件。它通常用于将一组相关的控件放置在一个框架中,以提供更好的可读性和布局结构。
333 0
|
10月前
|
Java Maven
IDEA修改默认配置
有很多时候我们在IDEA里面新建项目都要重新配置Maven、JDK等环境非常麻烦,但实际上在本地进行开发的时候这些东西基本上都是固定的一套,不会存在多套,所以将这些设置成默认的会省去每次新建项目时进行重复的环境配置工作。 首先关闭所有项目,来到IDEA的欢迎页:
201 0
|
11月前
|
数据可视化 编译器 C++
C++ 用DEV-C++建一个Windows窗口程序带文本框和命令按钮
C++ 用DEV-C++建一个Windows窗口程序带文本框和命令按钮
1021 0
|
存储
多字节字符是干什么的?底层原理是什么?
多字节字符是干什么的?底层原理是什么?
298 0
|
Linux 开发者
关于UOS系统下打包安装使用的问题总结
关于UOS系统下打包安装使用的问题总结
关于UOS系统下打包安装使用的问题总结
|
测试技术 API
【pytest官方文档】解读- 插件开发之hooks 函数(钩子)
【pytest官方文档】解读- 插件开发之hooks 函数(钩子)
【pytest官方文档】解读- 插件开发之hooks 函数(钩子)
|
测试技术
Pytest----如何正确使用pytest的日志功能
Pytest----如何正确使用pytest的日志功能
448 0
|
数据安全/隐私保护
一步一步学Edit Control控件的用法
Edit Control控件最常见的用法,一般有有以下几种: 1、  显示默认的字符串; 2、  接受用户输入的字符串。 3、  作为密码框接受用户输入的字符串。
1061 0