[delphi-users:4436] StrToDate関数がうまくいかない

1,640 views
Skip to first unread message

dolphin

unread,
Apr 25, 2016, 12:22:39 AM4/25/16
to delphi...@freeml.com
こんにちは。饗庭と申します。

Delphi2007 Proで開発したプログラムで、あるお客様のみStrToDateがうまく変換できないので困っております。
他のお客様でも、開発環境でも問題ないのですが、どう言った原因が考えられますでしょうか?

現象:StrToDateで「’2016/04/25’は日付ではありません」とエラーメッセージが表示される。
StrToDatedef(a,0)でも0が返されてしまう。
当該のお客様の環境
Windows7 Pro 32ビット
日付と時刻の設定も問題ないようです。

確認すべき箇所がありましたら、ご教示願います。
宜しくお願い致します。

饗庭幸友


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
freemlを運営するGMOメディア株式会社では、
2017年新卒採用の募集をしております。
募集の職種は下記3職種
エンジニア職/Webデザイナー職/営業企画職
興味をお持ちの方はマイナビよりエントリーお願いします
http://ad.freeml.com/cgi-bin/sa.cgi?id=nJXVq
------------------------------------------------------[freeml byGMO]--

dacho

unread,
Apr 25, 2016, 12:40:30 AM4/25/16
to delphi...@freeml.com
こんにちは。

そのPCだけコントロールパネルの「日付、時刻または数値の形式の変更」
の設定が変更されているんじゃないでしょうか。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
何とかしたい!保険やお金の悩み!
プロに相談してみませんか?
無料保険相談で!JCBギフト6000円分をプレゼント!
http://ad.freeml.com/cgi-bin/sa.cgi?id=nJYiy
------------------------------------------------------[freeml byGMO]--

umez

unread,
Apr 25, 2016, 12:47:28 AM4/25/16
to delphi...@freeml.com
こんにちは、梅澤@プロキャストです。

自分だったら

var
s: string;
t: TDateTime;

としておいて、問題発生箇所の直前に

s := DateToStr(Date);
ShowMessage(s); // これで、その箇所での日付の
// 示し方が確認できるのでは?
// 以下は再確認
t := StrToDate(s);
ShowMessage(DateToStr(t));

// 以下はエラーになるかも
s := '2016/04/25';
t := StrToDate(s);
ShowMessage(DateToStr(t));

としてみるかもしれません。

dolphin <delphi...@freeml.com> さんは書きました。<2016/04/25>

>こんにちは。饗庭と申します。
>
>Delphi2007 Proで開発したプログラムで、あるお客様のみStrToDateがうまく変換でき
>ないので困っております。
>他のお客様でも、開発環境でも問題ないのですが、どう言った原因が考えられますで
>しょうか?
>
>現象:StrToDateで「’2016/04/25’は日付ではありません」とエラーメッセージが表
>示される。
> StrToDatedef(a,0)でも0が返されてしまう。
>当該のお客様の環境
>Windows7 Pro 32ビット
>日付と時刻の設定も問題ないようです。
>
>確認すべき箇所がありましたら、ご教示願います。
>宜しくお願い致します。
>
>饗庭幸友
>
>
>MLホームページ: http://www.freeml.com/delphi-users
>
>----------------------------------------------------------------------
>freemlを運営するGMOメディア株式会社では、
>2017年新卒採用の募集をしております。
>募集の職種は下記3職種
>エンジニア職/Webデザイナー職/営業企画職
>興味をお持ちの方はマイナビよりエントリーお願いします
>http://ad.freeml.com/cgi-bin/sa.cgi?id=nJXVq
>------------------------------------------------------[freeml byGMO]--

----------
Tomomi Umezawa um...@procast.co.jp


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
先着限定1,000名様モニター募集!
「ふじっ子煮」や「おまめさん」で有名なフジッコ株式会社より
カスピ海ヨーグルトの生きた乳酸菌【善玉菌のチカラ】を
送料無料、お試し価格でご案内中!詳細はこちら↓
http://ad.freeml.com/cgi-bin/sa.cgi?id=nJYnu
------------------------------------------------------[freeml byGMO]--

dolphin

unread,
Apr 25, 2016, 12:54:24 AM4/25/16
to delphi...@freeml.com
お返事ありがとうございました。
別のWin7マシンと比較しましたが、「日付、時刻または数値の形式の変更」の設定が変更」はありませんでした。

饗庭幸友


> 2016/04/25 13:40、dacho <delphi...@freeml.com> のメール:
MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
期間限定、楽天カード新規入会キャンペーン実施中!
入会&利用で、もれなく5,000円相当分のポイントプレゼント!
年会費永年無料・楽天以外の利用でもポイントがたまる
便利でお得なカードのご案内は以下よりご覧ください。
http://ad.freeml.com/cgi-bin/sa.cgi?id=nJYsW
------------------------------------------------------[freeml byGMO]--

7of9

unread,
Apr 25, 2016, 2:08:15 AM4/25/16
to delphi...@freeml.com
7of9です。


umezさんの以下は試されたでしょうか?
こういうシンプルな処理の方が原因の特定につながるかもしれませんので。

> s := DateToStr(Date);
> ShowMessage(s); // これで、その箇所での日付の
> // 示し方が確認できるのでは?
> // 以下は再確認
> t := StrToDate(s);
> ShowMessage(DateToStr(t));
>
> // 以下はエラーになるかも
> s := '2016/04/25';
> t := StrToDate(s);
> ShowMessage(DateToStr(t));


C++ Builderですが、StrToDateTime()ではまった記事を以下に書いています。

http://qiita.com/7of9/items/ab67f7c03459f294aaf8

ここでも日付形式(yyyy/mm/dd以外)で
「「日付または時刻ではありません。」のエラーが出ていました。


VarToDateTime()でもはまる点があり、StrToDateTime()からVarToDateTime()
に置き換えするよりは、原因の特定を先にした方がいいと思います。







> お返事ありがとうございました。
> 別のWin7マシンと比較しましたが、「日付、時刻または数値の形式の変更」の設定が変更」はありませんでした。
>
> 饗庭幸友
>
>
> > 2016/04/25 13:40、dacho <delphi...@freeml.com> のメール:
> >
> > こんにちは。
> >
> > そのPCだけコントロールパネルの「日付、時刻または数値の形式の変更」
> > の設定が変更されているんじゃないでしょうか。
> >
> >
> > MLホームページ: http://www.freeml.com/delphi-users
> >
> > ----------------------------------------------------------------------
> > 何とかしたい!保険やお金の悩み!
> > プロに相談してみませんか?
> > 無料保険相談で!JCBギフト6000円分をプレゼント!
> > http://ad.freeml.com/cgi-bin/sa.cgi?id=nJYiy
> > ------------------------------------------------------[freeml byGMO]--
> >


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
簡単なアンケートを回答後、無料保険相談を体験いただくと
JCB商品券5000円相当分をもれなくプレゼント!
今すぐ出来るカンタン貯蓄法をアドバイスいたします☆
詳しくはこちら↓
http://ad.freeml.com/cgi-bin/sa.cgi?id=nJZkq
------------------------------------------------------[freeml byGMO]--

M&S

unread,
Apr 25, 2016, 2:31:38 AM4/25/16
to delphi...@freeml.com
>> StrToDate関数がうまくいかない

こんちには
発言は初かもしれないM&Sと申します。

文字列型→日付型変換は環境に依存しないように次の方法でやってます。

function StrDate2(arg:String):TDateTime;
{文字列を日付型に変換}
var
dtfmDEF : String;
dtspDEF : Char;
Rst : TDateTime;
begin
if ( arg = '' ) then
begin
Result := 0;
Exit;
end;
dtfmDEF := SysUtils.ShortDateFormat;
dtspDEF := DateSeparator;

SysUtils.ShortDateFormat := 'y/m/d';
DateSeparator := '/';
try
Rst := StrToDate(arg);
except
On EConvertError do
Rst := 0;
end;

if ( Rst = 0 ) then
begin
SysUtils.ShortDateFormat := 'y.m.d';
DateSeparator := '.';
try
Rst := StrToDate(arg);
except
On EConvertError do
begin
Rst := 0;
end;
end;
end;
if ( Rst = 0 ) then
begin
SysUtils.ShortDateFormat := 'm/d/y';
DateSeparator := '/';
try
Rst := StrToDate(arg);
except
On EConvertError do
Rst := 0;
end;
end;

SysUtils.ShortDateFormat := dtfmDEF;
DateSeparator := dtspDEF;

Result := Rst;
end;

//0を返す時は変換できなかったとき




MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
ミュゼ≪WEB予約限定スペシャル価格≫人気の2箇所美容脱毛が100円♪
\ 全国185店舗☆サロン移動もOK /追加料金ナシで何度でも通えちゃう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=nJZ1N
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
Apr 25, 2016, 3:54:32 AM4/25/16
to delphi...@freeml.com
饗庭さん、M&Sさん、こんにちは。

細川です。

M&Sさんの方法が一番良いと思いますが、ShortDateFormat などは最近の Delphi では、 FormatSettings
に纏まりました。

FormatSettings.ShortDateFormat などとして扱います。

なお、個人的には以下の関数(String2Date)で変換しています。
参考になれば、幸いです。

-----------------------------------------------------------------------------

interface

function String2Date(
const iStr: String;
const iFormat: String = 'yyyy/mm/dd hh:nn:ss'): TDateTime;

implementation

function TryStrToDateTimeEx(
const iStr: String;
out oDateTime: TDateTime): Boolean;
label
Last;
const
DateSeps: array [0.. 1] of Char = ('/', '-');
TimeSeps: array [0.. 1] of Char = (':', '.');
var
FS: TFormatSettings;
i, j: Integer;
begin
FS := TFormatSettings.Create;

for i := Low(DateSeps) to High(DateSeps) do begin
FS.DateSeparator := DateSeps[i];

for j := Low(TimeSeps) to High(TimeSeps) do begin
FS.TimeSeparator := TimeSeps[j];

Result := TryStrToDateTime(iStr, oDateTime, FS);
if (Result) then
goto Last;
end;
end;

Last:
end;

function String2Date(
const iStr: String;
const iFormat: String = 'yyyy/mm/dd hh:nn:ss'): TDateTime;
var
KeepShortDateFormat: String;
begin
Result := 0;

if (iStr = '') then
Exit;

KeepShortDateFormat := FormatSettings.ShortDateFormat;

FormatSettings.ShortDateFormat := iFormat;

if (not TryStrToDateTimeEx(iStr, Result)) then
Result := 0;

FormatSettings.ShortDateFormat := KeepShortDateFormat;
end;

-----------------------------------------------------------------------------



Regards,
HOSOKAWA Jun / embarcadero MVP for Delphi
[S/G] SERIALGAMES Inc.
TEL: 03-5812-0980
FAX: 03-5812-0970

---------------------------------------------------------------
このメールには、本来の宛先の方のみに限定された機密情報が含まれて
いる場合がございます。お心あたりのない場合は、送信者にご連絡のうえ、
このメールを削除してくださいますようお願い申し上げます。
PLEASE READ:This e-mail is confidential and intended for
the named recipient only. If you are not an intended recipient,
please notify the sender and delete this e-mail.
---------------------------------------------------------------


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
freemlを運営するGMOメディア株式会社では、
2017年新卒採用の募集をしております。
募集の職種は下記3職種
エンジニア職/Webデザイナー職/営業企画職
興味をお持ちの方はマイナビよりエントリーお願いします
http://ad.freeml.com/cgi-bin/sa.cgi?id=nKa5a
------------------------------------------------------[freeml byGMO]--

dolphin

unread,
Apr 26, 2016, 3:01:59 AM4/26/16
to delphi...@freeml.com
梅澤@プロキャストさん、M&Sさん、7of9さん、細川さん、皆様こんにちは。

StrToDate関数の件で、問い合わせしておりました饗庭と申します。

お客様の環境で、DateTimeToStr(Now)を表示するようにしましたところ、4/26/2016 ...となっておりました。
皆様からご案内いただいたコードで対応しようとしましたら、AD.16.04.26といった表示になりました。
そこで、コントロールパネルから「地域」→「形式」が「日本語(日本)」となっていたのを、「英語(米国)」に変更し、表示が変わったことを確認してから、再度「日本語(日本)」に戻すと、改修前のプログラムでも問題なく表示するようになりました。お騒がせしました。
色々と皆様からアドバイスをいただき、本当にありがとうございました。




> 2016/04/25 13:47、umez <delphi...@freeml.com> のメール:
MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
何とかしたい!保険やお金の悩み!
プロに相談してみませんか?
無料保険相談で!JCBギフト6000円分をプレゼント!
http://ad.freeml.com/cgi-bin/sa.cgi?id=nKnQM
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages