如何将不同格式的日期和时间进行转换?

4

我拥有的数据

我有一个存储在数据库中的数据,其中包含以字符串形式存储的日期和时间。

这些数据存储在中央服务器中。在这些数据中,日期和时间以不同的格式存储(根据客户端机器的日期时间格式而变化)。

我的目标

现在,我想将所有不同格式的日期和时间字符串转换为“yyyy-mm-dd hh:mm:ss”格式。

我遇到的问题

我无法将带有多个日期时间格式的日期时间数据转换为单一格式。

例如:我的机器日期时间格式为yyyy-mm-dd,但当我尝试转换以下日期时:

StrToDateTime('2015/02/10')

它抛出了一个异常。

有谁能告诉我如何实现这个操作? 如果需要更多细节,请让我知道。 提前致谢。


2
不幸的是,这是糟糕编码的最终结果。日期“02/10/15”可能是2015年2月10日、2015年10月2日或2002年10月15日。解决方案是一开始就不要以这种格式存储它。 - Jerry Dodge
1
用“-”替换“/”字符。 - LU RD
1
你将在哪台机器上进行转换?是写入数据的那台机器吗?从中可以汲取的重要教训是,日期、数字等格式应视为显示和/或输入问题。在内部以良好定义的格式存储数据。只有在程序边界处,与用户接口时才能使用本地格式。 - David Heffernan
@DavidHeffernan 不是的,我是在另一台机器上进行转换。数据的写入是从其他具有不同日期和时间格式的机器完成的。 感谢您的建议,David,我会记住的。你总是能帮助我解决问题。谢谢。 - A B
2
为什么要在数据库中将日期/时间值存储为字符串?大多数数据库都有适当的日期/时间数据类型,应该使用它们。它们不会遇到这个问题。 - Remy Lebeau
3个回答

9
您需要定制日期格式设置,例如:
procedure Test;
var
  DT: TDateTime;
  FS: TFormatSettings;

begin
  FS:= TFormatSettings.Create;
  FS.DateSeparator:= '/';
  FS.ShortDateFormat:= 'yy/m/d';
  DT:= StrToDateTime('2015/02/10', FS);
  Writeln(FormatDateTime('dd mm yyyy', DT));
end;

虽然这是正确的,但我担心 OP 的问题更深入 - 数据库已经包含了不同风格的格式设置。 - Jerry Dodge
1
当现有数据中存在不同的格式时,您需要一些逻辑来检查数据、确定格式,然后选择一个格式字符串在StrToDateTime中使用。假设有合理数量的格式,只要您能处理歧义(根据Jerry Dodge的原始评论),那么这应该是可以的。 - Chris Thornton
感谢您的回答,但问题仍然存在,这是因为日期和时间以不同的格式存储。 - A B
TFormatSetting不是一个记录吗?那么如何可能使用.Create进行实例化呢? - undefined

1
在这个过程中出现了错误,因为不能使用FS:=TFormatSettings.Create;TformatSettings仅保留给System。TformatSettings没有Create方法。编译器在这一行告知未知的Craeate方法。因此,我建议使用这个过程将一个字符串转换为另一个不同格式的字符串。
enter code here

Procedure TForm4.ConvertDate(var DataValue:string);   
var
        AFormatSettings:TFormatSettings;  
        ALocaleID: integer;  
        DateTym :TdateTime;

begin  
 DataValue:=StringReplace(DataValue, '/',{OldPattern} '-', {NewPattern}     
                 [rfReplaceAll, rfIgnoreCase] {Flags:TreplaceFlags});     
  //this StringReplace must be used because with Separator  / for date    
   //occurs error          
 GetLocaleFormatSettings(ALocaleID, AFormatSettings);  
 AFormatSettings.ShortDateFormat:='DD-MM-YYYY';   
 DateTym:=StrToDate(DataValue, AFormatSettings);     
 AFormatSettings.ShortDateFormat:='YYYY-MM-DD';      
 //AFormatSettings.ShortDateFormat:='MM-DD-YYYY'; //can be also used        
 DataValue:=FormatDateTime(AFormatSettings.ShortDateFormat,DateTym);          

end;        

不要担心系统AFormatSettings会被更改。如果您退出此过程,则AFormatSettings的系统设置将返回默认设置,因为它是局部变量。

0

遇到了同样的问题。显然我想将日期转换为字符串,格式为"yyyy-MM-dd",但是我无法做到...显然一个简单的解决方法是将系统日期格式更改为所需的输出格式...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接