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

在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将保存的值写回去。
当然,如果程序已经在运行,别的程序也象我们这样把格式改成它需要的格式,那就没办法了,同时就只能运行一个,否则会互相干扰。如果一定要想办法的话,或许可以处理 WM_SETTINGCHANGE 消息,再把改掉的改回来?有点强盗

http://hi.baidu.com/northarcher/blog/item/8399e5f3b8543840342acc1a.html

转载于:https://www.cnblogs.com/JackSun/archive/2011/01/04/1925252.html

【转载】Delphi获取与设置系统时间格式(长日期与短日期)相关推荐

  1. WinAPI: GetLocalTime、SetLocalTime、SetSystemTime - 获取与设置系统时间

    为什么80%的码农都做不了架构师?>>>    //声明 GetLocalTime(var lpSystemTime: TSystemTime {TSystemTime 结构} ); ...

  2. php用什么服务器系统时间格式,php中时间戳和日期格式的转换

    一,PHP时间戳函数获取指定日期的unix时间戳 strtotime("2009-1-22″) 示例如下: echo strtotime("2009-1-22″) 结果:12325 ...

  3. 倍福TwinCAT(贝福Beckhoff)基础教程5.1 TwinCAT-1 获取和设置系统时间

    使用功能块NT_GetTime,NETID填写两个单引号表示本机,START就是一个触发信号,一般的功能块都需要一个上升沿触发执行,最后的输出类型都是让系统自己决定,然后统一把这些变量放到全局变量中( ...

  4. delphi中设置系统时间方法

    procedure TMainFrm.Timer1Timer(Sender: TObject); var   systemtime:Tsystemtime;   dt:TDateTime; begin ...

  5. Windows中获取和设置系统日期时间的C程序

    In this C program, we have to set, get the system's date and time. 在此C程序中,我们必须设置,获取系统的日期和时间. To get, ...

  6. 获取当前的系统时间 年-月-日 小时-分钟-秒

    获取当前的系统时间 年-月-日 小时-分钟-秒 代码如下: NSDate * newDate = [NSDate date]; //实例化一个NSDateFormatter对象 NSDateForma ...

  7. Java获取当前的系统时间

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...

  8. date 显示或设置系统时间和日期

    显示或设置系统时间和日期 date [options] [+format] date [options] [new date] date用来显示系统的时间和日期,超级用户可以使用date来更改系统时钟 ...

  9. linux 设置系统时间为当前网络时间

    一.背景 二.linux的两个时间 1. 系统时间 2. 硬件时间 3. ntpdate 一.背景 最近在学习linux 相关知识,配置了一个VMware 并安装了Centos操作系统,但是每次因为手 ...

最新文章

  1. SAP Spartacus Popover Component 显示与否的逻辑判定
  2. Android CardView卡片布局 标签: 控件
  3. 26岁的她,成为深圳大学史上最年轻正教授!
  4. 十万亿级OLAP引擎解读-AnalyticDB如何支撑数据银行超大规模低成本实时分析
  5. Django学习资源
  6. Understanding the Bias-Variance Tradeoff
  7. js/jquery禁止页面回退
  8. 马斯克震撼演讲:世界上最可怕的事情,是没有内驱力
  9. Java 标准计算器(使用SWT做界面)
  10. Chrome 扩展程序 CrxMouse 优化版 v3.0.1
  11. 小白怎么入门网络安全?
  12. c语言第三章课后作业答案,C语言第三章习题带答案
  13. 深度学习——李宏毅第一课2020
  14. 云计算+,如何推动建筑行业智慧化升级?
  15. LCD1602液晶显示屏的入门级应用(一)
  16. Apollo Cyber实践之talker-listener通信
  17. 【Multisim仿真】光控报警电路
  18. 网页策略游戏《绝地战争》完整源码下载
  19. 中图分类号,文献标识码查询
  20. 设计模式-开闭原则(6)

热门文章

  1. 优酷 米兔机器人_米兔机器人如何发豆芽?
  2. python的调用函数_Python函数调用
  3. 通过数据评估渠道用户质量的方法
  4. import package java_java初学者,如何理解package和import?
  5. ubuntu联网_Ubuntu物联网操作系统新版发布,支持10年安全更新,镜像仅280M
  6. android imageview图片崩溃,android - setImageResource导致应用程序崩溃 - 堆栈内存溢出...
  7. beanutils copyproperties_你还在用BeanUtils进行对象属性拷贝?
  8. canvas插件_HTML系列之-HTML5新元素之Canvas详解
  9. VS2012下基于Glut 矩阵变换示例程序:
  10. poj 1330(LCA)