我正在寻找一个函数来将函数YYYYMDD
创建的任何字符串(YY/MM/DD
,YYMMDD
,FormatDateTime,...)转换为datetime。
例
我有一个由YYYYMMDD
格式化FormatDateTime
c格式的字符串日期
mydatestr:=FormatDateTime('YYYYMMDD',Mydate);
现在我怎么能再次将mydatestr转换为DateTime
?
UPDATE
这些功能
function StrToDate(const S: string): TDateTime; overload;
function StrToDate(const S: string;
const FormatSettings: TFormatSettings): TDateTime; overload;
function StrToDateTime(const S: string): TDateTime; overload;
function StrToDateTime(const S: string;
const FormatSettings: TFormatSettings): TDateTime; overload;
不支持传递具有要转换格式的字符串。
我看起来像这样
Mydatetime:=InvFormatDatetime('20091225','yyyymmdd');
要么
Mydatetime:=InvFormatDatetime('20090108','yyyyddmm');
现有的解决方案很简单,RX包中的rxDateutil.pas单元中的StrToDateFmt函数可以在这里下载:http://sourceforge.net/projects/rxlib/
编辑:
上面提到的函数和来自rxDateutil.pas的StrToDateFmt正在按照您的预期完成,使用指定的字符串掩码将字符串转换为日期时间,代码太大而无法包含,因为此单元还包含其他日期函数,其中一些需要将字符串转换为日期。
使用示例:
Result := StrToDateFmtDef('MM/DD/YYYY', '11/11/2011', Now);
我喜欢Tuncay的答案,但有一些问题。我已经留下了评论,但我没有足够的声望点。
所以,这是Tuncay答案的修正版本(修改“TFormatSetting”缺少“s”并指定格式设置日期分隔符):
function AnyStringToDate(fmt, dt: String) : TDateTime;
var
fs : TFormatSettings;
Begin
fs := TFormatSettings.Create;
fs.DateSeparator := '-';
fs.ShortDateFormat := fmt;
result := StrToDateDef(dt, 0, fs);
End;
与Tuncay的答案相同,AnyStringToDate可以如下使用:
mydate := AnyStringToDate('YYYY-MM-DD', '2015-01-20');
您可以使用属于StrToDateFmt的JvJCLUtils单位的JEDI Code Library函数
在你的情况下:
Function InvFormatDatetime ( dateString :String; dateFormat :String ) : TDateTime;
begin
Result := JvJCLUtils.StrToDateFmt ( dateFormat, dateString );
end;
不使用任何外部库,您可以执行以下操作:
function AnyStringToDate(fmt, dt: String) : TDateTime;
var
fs : TFormatSettings;
Begin
fs := TFormatSettings.Create;
fs.ShortDateFormat := fmt;
result := StrToDateDef(dt, 0, fs);
End;
然后使用它像:
mydate := AnyStringToDate('YYYY-MM-DD', '2015-01-20');
我没有编译这个,但这个想法很简单。
你检查过StrToDate和StrToDateTime了吗?
Function InvFormatDatetime (Cadena:String; Formato:String) : TDateTime;
Var
PosD, PosM, PosY : Integer;
sD, sM, sY : String;
begin
sd := '0';
sm := '0';
sy := '0';
If Length(Cadena) = Length(Formato) Then
Begin
Formato := UpperCase(Formato);
PosD := Pos('D',Formato);
PosM := Pos('M',Formato);
PosY := Pos('Y',Formato);
sd := Copy(Cadena,PosD,2);
sm := Copy(Cadena,PosM,2);
if Length(Cadena) = 6 then
begin
sy := Copy(Cadena,PosY,2);
if StrToInt(sy) > 50 then
sy := '19'+sy
else
sy := '20'+sy;
end
else
sy := Copy(Cadena,Posy,4);
End;
Result := EncodeDate(StrToInt(sY),
StrToInt(sM),
StrToInt(sD));
End;
问候
我知道它为时已晚,但为了利益,Delphi XE6以后您现在可以执行以下操作
uses
System.DateUtils;
var
dt: TDateTime;
begin
dt := ISO8601ToDate('20190408');
end.
dt现在是2019/04/08