关于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
网络矩阵/视频监控平台

目录
相关文章
|
Ubuntu Linux C++
Ubuntu20.4配置arm交叉编译环境
我是在虚拟机中配置的,如果你的嵌入式设备足够完成自己的编译,可以不考虑虚拟机的。
1802 0
|
7月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
2088 7
|
存储 移动开发 程序员
alist对接钉钉sso登录
本文介绍了如何将Alist与钉钉SSO登录对接。Alist是一个基于Go语言开发的文件管理程序,支持多平台和多种存储方式。通过设置自定义头部、配置钉钉开放平台应用及回调参数,并获取Client ID和Client Secret,可实现钉钉SSO登录功能。最后根据需求配置用户权限,默认权限值可通过相加不同权限数字获得。成品展示了一个美观且实用的文件管理系统。
alist对接钉钉sso登录
|
弹性计算 人工智能 运维
Terraform从入门到实践:快速构建你的第一张业务网络(上)
本次分享主题为《Terraform从入门到实践:快速构建你的第一张业务网络》。首先介绍如何入门和实践Terraform,随后演示如何使用Terraform快速构建业务网络。内容涵盖云上运维挑战及IaC解决方案,并重磅发布Terraform Explorer产品,旨在降低使用门槛并提升用户体验。此外,还将分享Terraform在实际生产中的最佳实践,帮助解决云上运维难题。
983 1
Terraform从入门到实践:快速构建你的第一张业务网络(上)
|
监控 数据可视化 安全
如何查找访问 Nginx 的前 10 个 IP?
【5月更文挑战第1天】
771 1
如何查找访问 Nginx 的前 10 个 IP?
|
人工智能
三战VS2019编译VTK7.1+Qt5.15.2
本文记录了作者在VS2019环境下编译VTK 7.1与Qt 5.15.2的历程,包括正确配置方法、遇到的编译错误以及解决过程。
331 5
QT6使用CMamke将qml打包成dll
QT6使用CMamke将qml打包成dll
567 0
|
JavaScript 前端开发 API
深入浅出:使用Node.js打造简易Web API
【8月更文挑战第31天】本文旨在通过一个简单实例,引导读者快速入门Node.js并创建自己的Web API。我们将从零开始,一步步搭建起服务端应用,涉及环境搭建、基本语法、路由处理等关键知识点,最后以代码实例加深理解。无论你是前端开发者还是后端新手,这篇文章都能让你轻松上手,体验后端开发的乐趣。
|
Java 应用服务中间件
Springboot启动的时候初始化的线程池默认配置tomcat
Springboot启动的时候初始化的线程池默认配置tomcat
487 1