程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用編程來實現24小時制到12小時制的轉換

用編程來實現24小時制到12小時制的轉換

編輯:Delphi
昨天有一位網友在群聊中提到了這個問題,晚上回去想了很久。花了三個小時,終於找到了解決的方法,現在拿出來與大家分享:
  
  首先想到的是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_USER\ControlPanel\International
  而其中的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;
  {打開主鍵'\ControlPanel\International'}
  Reg.OpenKey('\ControlPanel\International',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('\ControlPanel\International',False);
  Try
  ifReg.ReadString('sTimeFormat')='tth:mm:ss'then
  Result:=ts_12
  else
  Result:=ts_24
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved