全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4353
推到 Plurk!
推到 Facebook!

FormatDateTime 在有些機器上無法傳回民國年!?

尚未結案
darkside
一般會員


發表:15
回覆:42
積分:16
註冊:2002-03-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-06 09:13:58 IP:139.223.xxx.xxx 未訂閱
這個問題很少發生,但是確實發生了,在某些 Windows 2000 的 機器上,執行命令: FormatDateTime('eee', Now); 傳回來的竟然還是西元年 '2003',大部分的機器則正常傳回 '092'。 有人知道這是怎麼回事嗎? 控制台的區域設定已經檢查過,跟其他正常的機器比較過都沒有任何不同處。 我懷疑是 Windows 的某個元件還是 DLL 需要更新,有遇過此問題的人麻煩指教一下好嗎?謝謝!
Jasonwong
版主


發表:49
回覆:931
積分:581
註冊:2006-10-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-06 11:07:53 IP:61.64.xxx.xxx 未訂閱
你可能要去控制台上查一下有關於 "年" 的設定 -- 聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
darkside
一般會員


發表:15
回覆:42
積分:16
註冊:2002-03-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-06 11:53:20 IP:139.223.xxx.xxx 未訂閱
引言: 你可能要去控制台上查一下有關於 "年" 的設定
所謂有關 "年" 的設定,不就是在 [地區選項] 的 "日期" 頁夾裡面嗎? 我全都檢查過了,跟正常機器的設定一模一樣,因此我才會懷疑是不是 Windows 2000 有什麼元件版本有差異而造成這種情形。真燒腦筋啊.... 附帶一提,Delphi help 裡面關於格式化的 specifiers 只有提到 yyyy 的格式,沒說有支援 eee 的民國年格式,但在大部分機器上確實可以用 eee 來取得民國年。
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-06 12:37:09 IP:211.76.xxx.xxx 未訂閱
hi, darkside, 請先確認在地區選項中的[一般]裡的[您的地區設定(位置)]是不是設定在[中文(台灣)], 這個會影響 eee 的年份出現狀況!!
darkside
一般會員


發表:15
回覆:42
積分:16
註冊:2002-03-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-06 12:41:22 IP:139.223.xxx.xxx 未訂閱
引言: hi, darkside, 請先確認在地區選項中的[一般]裡的[您的地區設定(位置)]是不是設定在[中文(台灣)], 這個會影響 eee 的年份出現狀況!!
[地區選項]的 "位置" 是 "中文(台灣)" 沒錯。 [地區選項]的每個頁夾我都檢查好幾次了。
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-06 14:28:29 IP:61.62.xxx.xxx 未訂閱
引言: [地區選項]的 "位置" 是 "中文(台灣)" 沒錯。 [地區選項]的每個頁夾我都檢查好幾次了。
OK, 這樣的話, 應該就是他的日期真的設錯了. 請先確認他的西元年是不是正確的, 若用 e 會顯示 2003 年的話, 用 yyyy 會顯示 3914 年的, 請你確認一下!
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(FormatDateTime('[e, yyyy]', now));
end;
正常的話, 會出現 [92, 2003], 若該電腦的日期是錯的, 會出現 [2003, 3914], 這樣了解嗎? 只要將該電腦的日期設正確就沒有問題了!! 發生的原因就會是在 [地區選項][日期]是設在民國, 但年份設為 2003 就會發生這個問題的!
darkside
一般會員


發表:15
回覆:42
積分:16
註冊:2002-03-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-06 15:28:03 IP:139.223.xxx.xxx 未訂閱
引言: 發生的原因就會是在 [地區選項][日期]是設在民國, 但年份設為 2003 就會發生這個問題的!
可是我試過,不管控制台的地區選項裡面設定成 "中華民國曆"、"西曆(英文)"、還是 "西曆(中文)",同樣的程式在我的電腦跑出來的結果都是一樣的,也就是三種月曆的設定,使用 FormatDateTime('eee', Now) 傳回的結果都是 '092',並沒有不同喔。 p.s. 那幾台有問題的電腦的日期時間是正確的,並沒有多加 1911 的情況。
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-06 16:14:55 IP:210.68.xxx.xxx 未訂閱
darkside 所遇到的問題我能理解 我之前也深受其害,就是找不出是何原因,姑且算是MS 的bug 吧 因為 eee 的用法,似乎並不屬標準的格式用法 最終的處理方式,還是自行寫function 拆解年的部份,減1911 再組合 雖然是麻煩些,但是也是最妥當的方法    darkside 參考看看吧    
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-06 18:25:38 IP:203.204.xxx.xxx 未訂閱
引言: 可是我試過,不管控制台的地區選項裡面設定成 "中華民國曆"、"西曆(英文)"、還是 "西曆(中文)",同樣的程式在我的電腦跑出來的結果都是一樣的,也就是三種月曆的設定,使用 FormatDateTime('eee', Now) 傳回的結果都是 '092',並沒有不同喔。 p.s. 那幾台有問題的電腦的日期時間是正確的,並沒有多加 1911 的情況。
不, 我是要請你試的是 : ShowMessage(FormatDateTime('[e, yyyy]', now)); 另外再請你試試 ShowMessage(FormatDateTime('[g e]', now)); 看一下結果到底是什麼!!
darkside
一般會員


發表:15
回覆:42
積分:16
註冊:2002-03-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-06 21:42:26 IP:61.229.xxx.xxx 未訂閱
引言: ShowMessage(FormatDateTime('[e, yyyy]', now)); ShowMessage(FormatDateTime('[g e]', now));
我覺得 ddy 可能是對的,還是用自己寫的函數來轉換好了。 Anyway 我還是會把您提供的上面兩道敘述試看看,等試出來後,結果再貼上來。只是可能要等一下下,因為有問題的機器在客戶那兒。 謝謝。
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-07-06 22:28:40 IP:61.62.xxx.xxx 未訂閱
引言: 我覺得 ddy 可能是對的,還是用自己寫的函數來轉換好了。 Anyway 我還是會把您提供的上面兩道敘述試看看,等試出來後,結果再貼上來。只是可能要等一下下,因為有問題的機器在客戶那兒。
ok, 等待你測試的結果. 補充一下, FormatDateTime 是沒有 eee 的參數哦, 只有 ee 的參數, 是針對 Taiwan, Japan, Korea 才有的地區年份哦, eee 是沒有意義的, 你可以自己試一下就知道了, 在 delphi help 中也是如此說明的!! 也就是說沒有 eee, 你說會回傳 '092' 應該不可能的, 應該只會回傳對應 ee 的 92 而已! 或者你試試看 eeee 會不會回傳 '0092'.. 之所以會請你測試 e, y 這樣同時出現的狀況, 才能知道是那裡的問題, 若是只憑 e 得到 2003 的話, 應該是電腦的時間有問題才對, 這是因為電腦內有其他的程式在取得系統日期時, 要使用西元曆, 但並沒有確認 locale 的設定直接修改為 2003, 也就造成了西元 3914 的現象的, 不過你也確認過了該電腦的日期是正確的, 所以弟才會建議你進行測試, anyway, 看測試後的結果再來看看問題在那裡!! 另外地區選項中的日期設定無論為"中華民國曆"、"西曆(英文)"、還是 "西曆(中文)"都不會影響 e, y 的顯示結果的, 所以改這個是完全沒有影響的! 以下為節錄 delphi help 中的 e 說明: ----------------------------- e (Windows only) Displays the year in the current period/era as a number without a leading zero (Japanese, Korean and Taiwanese locales only). ee (Windows only) Displays the year in the current period/era as a number with a leading zero (Japanese, Korean and Taiwanese locales only).
darkside
一般會員


發表:15
回覆:42
積分:16
註冊:2002-03-11

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-07-08 08:45:59 IP:139.223.xxx.xxx 未訂閱
ok, 各種測試結果如下: (左邊是格式字串,右邊是結果)
  'eee , yyyy'   ==> '3 , 2003'
  'g , e'      ==> ' , 3'
  'ee/mm/dd'   ==> '03/07/08'
  'yyyy/mm/dd' ==> '2003/07/08'
顯然地,民國年在這台機器上都無法轉換成功。'eee' 的效果跟單個 'e' 是一樣的,都會顯示 2003 的最右邊的數字 '3'(不會補0)。而 'g' 則完全無作用,傳回一個空白字元。 Any idea ? 發表人 - darkside 於 2003/07/08 10:39:03
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-07-08 23:20:00 IP:61.62.xxx.xxx 未訂閱
可否再請你試一下這段程式碼? 這就是會出現 locale 的 era string 的 windows api 的部分, 請先試一下看看!    
procedure TForm1.Button2Click(Sender: TObject);
var
  SystemTime: TSystemTime;
  FormatStr: string;
  Buffer: array[0..255] of Char;
  year, month, day: Word;
begin
  FormatStr:='gg';
  DecodeDate(Now, year, month, day);
  SystemTime.wYear:= year;
  SystemTime.wMonth:=month;
  SystemTime.wDay := day;
  GetDateFormat(GetThreadLocale, DATE_USE_ALT_CALENDAR, @SystemTime,
        PChar(FormatStr), Buffer, SizeOf(Buffer));
  ShowMessage(Buffer);
end;
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-07-09 09:45:25 IP:211.76.xxx.xxx 未訂閱
關於這個問題, 我提供一下我的經驗 ... 確實會有些機器會造成日期格式的不確定, 尤其是作過 XP SP1, 或安裝 Office (2000, XP 版)更是如此. 我公司有二台 OS (XP pro)及硬/軟體都一樣, 但是就是 ERA Year 硬是不同. 所以: 1. 不要太相信抓到的 ERA Year , 為此我改了好多元件 2. 不要用 FormatDateTime 或 DateToStr 之類 Date/Time 與 String 的轉換 function, 因為轉出來的不一定會是你要的(和 control panel 的地區設定有關), 你也不可能一台台改吧! 3. 使用 DecodeDate 或 EncodeDate 處理 Date/Time (一律是西元年)如果要轉成民國再減 1911 就是了
------
將問題盡快結案也是一種禮貌!
darkside
一般會員


發表:15
回覆:42
積分:16
註冊:2002-03-11

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-07-09 10:55:42 IP:139.223.xxx.xxx 未訂閱
我想客戶已經快被我煩死了,我也不好意思一直要客戶幫我測東西。 即使測出來了,若是作業環境的設定問題,或安裝了某些軟體所造成,若要一台一台機器檢查修改,也不切實際。雖然很想了解原因,但還是作罷。 因此我決定自己寫轉換函式,先把程式中所有 FormatDateTime('ee....) 的指令改呼叫自己的。    很感謝 Tim Huang 兄的熱心協助,以及其他人的建議。    順殯把我寫的函式貼上來,需要的人可以省一點功夫。支援民國前的年份。    
(*
  將日期轉成民國年格式的字串      ADate         輸入的日期
  YearDigits    輸出的民國年要幾位數
  Separator     日期分隔字元
*)
function DateToRocStr(const ADate: TDateTime; YearDigits: Integer;
  Separator: string): string;
var
  wYear, wMonth, wDay: word;
  iYear: Integer;
  sYear, sMonth, sDay: string;
begin
  Assert((YearDigits > 0) and (YearDigits < 5));
  DecodeDate(ADate, wYear, wMonth, wDay);
  if wYear < 1900 then
  begin
    Result := StrRepeat(' ', YearDigits)   Separator   '  '   Separator   '  ';
    exit;
  end;      iYear  := wYear - 1911;
  sYear  := StrRight('00000'   IntToStr(iYear), YearDigits);
  if iYear < 1 then   // 民國前?
  begin
    Dec(iYear);
    sYear := StrRight('    '   IntToStr(iYear), YearDigits);
  end;      sMonth := Copy(IntToStr(wMonth 100), 2, 2);
  sDay   := Copy(IntToStr(wDay 100), 2, 2);
  Result := sYear   Separator   sMonth   Separator   sDay;
end;
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-07-09 12:00:36 IP:61.218.xxx.xxx 未訂閱
darkside 不錯喔~~能解決問題,就是好方法 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-07-10 08:20:57 IP:218.163.xxx.xxx 未訂閱
雖已討論結束, 我也來參一腳 darkside的碼解決了問題, 但對於太多已寫完的程式要去改成呼叫此function,事實上是有困難的    因此以下直接覆蓋掉sysutils中之DateTimeToStr及FormatDateTime,只要將此unit放在uses中之最後, 就可解決    這只是show一個想法, 實際要覆蓋的function 不只這兩個    
function DateTimeToStr(DateTime: TDateTime): string;
begin
  Result:=ConvertToTwDate(ShortdateFormat,DateTime);
end;    function FormatDateTime(const sFormat: string; DateTime: TDateTime): string;
var yr:word;
begin
  Result:=ConvertToTwDate(sFormat,DateTime);
end;    function ConvertToTwDate(sFormat:string;DateTime:TDateTime):string;
var yr:word;
begin
//note:一般民國年均是 以年/月/日之方式, 不考慮年在後
  Result:=sysutils.FormatDateTime(sFormat,DateTime);  //先呼叫原function
  if pos('e/', sFormat) > 0 then begin
    Fetch(Result,'/');
    yr:=YearOf(DateTime)-1911;
    if pos('eee/',sformat) > 0 then
      Result:=format('%3.3d', [yr] ) '/' result
    else if pos('ee/', sFormat) > 0 then
      Result:=format('-',[yr]) '/' result
    else
      Result:=format('%d',[yr]) '/' result;
  end;
end;    
darkside
一般會員


發表:15
回覆:42
積分:16
註冊:2002-03-11

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-07-16 14:32:11 IP:139.223.xxx.xxx 未訂閱
後記: 今天從客戶那邊得知,他們灌了 Windows 2000 Service Pack 4 之後,問題就不見了。給大家做個參考。
系統時間:2024-05-18 19:44:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!