zoukankan      html  css  js  c++  java
  • Delphi获取与设置系统时间格式,即GetLocaleInfo和SetLocaleInfo

     

     

    在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将保存的值写回去。
    当然,如果程序

  • 相关阅读:
    MySQL数据库8(四)数据表基本操作
    MYSQL 配置文件
    MySQL数据库8(三)数据库基本操作
    flink-connector-kafka consumer的topic分区分配源码
    kafka consumer assign 和 subscribe模式差异分析
    kafka 配置kerberos校验以及开启acl实践
    二路归并排序的java实现
    storm RollingTopWords 实时top-N计算任务窗口设计
    PriorityBlockingQueue优先队列的二叉堆实现
    堆排序算法的java实现
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/6892547.html
Copyright © 2011-2022 走看看