用编程来实现24小时制到12小时制的转换

38飞车

38飞车

2016-01-29 14:11

用编程来实现24小时制到12小时制的转换,用编程来实现24小时制到12小时制的转换
 
昨天有一位网友在群聊中提到了这个问题,晚上回去想了很久。花了三个小时,终于找到了解决的方法,现在拿出来与大家分享:
  
  首先想到的是TDateTimePicker控件有没有属性来实现这一功能的转换,因为这样做的好处不言而知。在我看了TDateTimePicker、

  TCommonCalendar这两个类的源码后得出了结论,不能用控件的属性或过程来实现这一转换。

  于是只好改变思路:

  我们知道,在Windows下可以修改时间的显示方式,具体方法如下:
  “控制面板”-“区域选项”(WINXP则是“日期与时间的显示方式”)-“时
  间”。在“时间格式”一栏中可以修改时间的显示格式,具的显示格式可在在“外观
  示例”中可以看到。
  现在可以知道“H:mm:ss”显示的是24小时制,而“tth:mm:ss”显示的则是12小时
  制。
  
  我们把“时间格式”设置为“tth:mm:ss”后再点击“确定”按钮退出。
  现在再来在窗体上放一个TDateTimePicker控件,OK,达到的预期的效果。
  
  刚准备舒一口气,又转念一想,程序到了别人的电脑那不是又不行了??
  看来,还得继续工作。
  
  我们知道Windows的系统设置一般都保存在注册表中。现在的关键是找到时间显示格式所保存的注册表主键。

  想一下,用的注册表搜索功能。
  我现在的系统时间是12小时制,它的显示格式是“tth:mm:ss”。好,就来搜索这个
  吧。终于找到了第一个,仔细思量一下,应该是的:主键是:
  HKEY_CURRENT_USERControlPanelInternational
  而其中的sTimeFormat键值名就是时间格式。
  但是,里边还有那么多的键值,要修改哪些呢?又是一个问题。

  想了一下,行,就用这个办法:

  1、导出主键
  2、在控制面板中把系统时间改为24小时制
  3、再导出主键
  4、运行两个记事体实例,分别打开刚才导出的主键(扩展名为.reg)
  5、比较,删除键值名和数据都相同的行


现在出来了结果:
  12小时制和24小时制有三个键值的数据不同
  键值名12小时频闹?4小时制的值
  iTime01
  iTimePrefix10
  sTimeFormatH:mm:sstth:mm:ss
  
  现在余下的问题就是如何编程序来实现了。
  Delphi对注册表的操作一般都是用TRegistry类来实现,具体的操作请参考相关资料。
  现在贴出其源码:
  
  unitSetTimeSotryUnit;
  
  interface
  
  uses
  Windows,Registry;
  
  Type
  Time_Story=(ts_12,{12小时制}
  ts_24{24小时制}
  );
  
  procedureSetTimeStory(constStory:Time_Story);
  functionGetTimeStory:Time_Story;
  
  implementation
  
  {---------------------------------------------------------------------------
  //
  //把系统时间的显示方式设置为指定类型
  //
  //参数:
  //Story:指定类型
  //
  --------------------------------------------------------------------------}
  procedureSetTimeStory(constStory:Time_Story);
  var
  Reg:TRegistry;
  begin
  Reg:=TRegistry.Create;
  {设置根主键为HKEY_CURRENT_USER}
  Reg.RootKey:=HKEY_CURRENT_USER;
  {打开主键'ControlPanelInternational'}
  Reg.OpenKey('ControlPanelInternational',False);
  Try{写入数据}
  CaseStoryof
  ts_12:{12小时制}
  begin
  Reg.WriteString('iTime','0');
  Reg.WriteString('iTimePrefix','1');
  Reg.WriteString('sTimeFormat','tth:mm:ss');
  end;
  ts_24:{24小时制}
  begin
  Reg.WriteString('iTime','1');
  Reg.WriteString('iTimePrefix','0');
  Reg.WriteString('sTimeFormat','H:mm:ss');
  end;
  end;
  Finally;
  Reg.CloseKey;{关闭主键}
  Reg.Free;
  end;
  end;
  

 {------------------------------------------------------------------------
  //
  //返回当前系统时间的显示方式
  //
  //返回值:
  //默认的返回为24小时制
  //
  -----------------------------------------------------------------------}
  functionGetTimeStory:Time_Story;
  var
  Reg:TRegistry;
  begin
  Result:=ts_24;
  Reg:=TRegistry.Create;
  Reg.RootKey:=HKEY_CURRENT_USER;
  Reg.OpenKey('ControlPanelInternational',False);
  Try
  ifReg.ReadString('sTimeFormat')='tth:mm:ss'then
  Result:=ts_12
  else
  Result:=ts_24
展开更多 50%)
分享

猜你喜欢

用编程来实现24小时制到12小时制的转换

Delphi
用编程来实现24小时制到12小时制的转换

怎么把win8系统时间改为24小时制?

windows系统
怎么把win8系统时间改为24小时制?

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Win8系统时间为12小时制怎么调整

windows系统
Win8系统时间为12小时制怎么调整

24小时动态心电图

电脑网络
24小时动态心电图

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

24小时排毒瘦身

减肥 健康减肥 减肥小妙招 减肥方法
24小时排毒瘦身

男人24小时身体需要

男人 男人养生
男人24小时身体需要

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

快捷方式/删除项/EXE自删除DIY

快捷方式/删除项/EXE自删除DIY

《进击的巨人》手游紫卡哪些容易拿?

《进击的巨人》手游紫卡哪些容易拿?
下拉加载更多内容 ↓