如何在Delphi中以MM/DD/YYYY格式设置日期

如何在Delphi中以MM/DD/YYYY格式设置日期,delphi,Delphi,我有下面提到的字符串数组 Param : array[1..5] of string = ('US','Dollor','27/03/2017','IND','INR'); 我需要找到包含日期的字符串,并将其格式化为MM/DD/YYYY。 为了实现这一点,我运行for循环并在TryStrToDate中传递每个字符串。若字符串是日期类型,它将返回true,然后我将以所需格式格式化该字符串。我的代码如下 for i := 1 to ParamCount do begin if TryS

我有下面提到的字符串数组

Param : array[1..5] of string = ('US','Dollor','27/03/2017','IND','INR');
我需要找到包含日期的字符串,并将其格式化为MM/DD/YYYY。 为了实现这一点,我运行for循环并在TryStrToDate中传递每个字符串。若字符串是日期类型,它将返回true,然后我将以所需格式格式化该字符串。我的代码如下

 for i := 1 to ParamCount do
  begin
   if TryStrToDate(Param[i],DateValue)=true then
   begin
    Param[i] := DateToStr(StrToDate(Param[i]));
    ShowMessage(Param[i]);
   end;
 end;
此处参数[]中的日期为DD/MM/YYYY,因此TryStrToDate无法理解。如何更改代码? 在此之后,最终结果应如下所示

Param : array[1..5] of string = ('US','Dollor','03/27/2017','IND','INR');
使用马克的解决方案如下:

  GetLocaleFormatSettings(ALocID, AFormatSettings);
  AFormatSettings.ShortDateFormat := 'DD/MM/YYYY';
  for i := 1 to ParamCount do
  begin
    if TryStrToDate(param[i], DateValue, AFormatSettings) = False then
      Continue;
    try
      DateVal := StrToDate(param[i], AFormatSettings);
      param[i] := DateToStr(DateVal);
      Continue;
    except
      Continue;
    end;
  end;
是一个Delphi库函数,它将尝试将字符串转换为TDateTime类型。在我的代码中,有一些我想要接受的格式是TryStrToDate函数不允许的。要在第一个方法失败时转换这些日期,我调用VarToDateTime。调用支持其他格式的变量函数

正如Remy所评论的,有一个选项参数,它允许您对所接受的格式进行某种程度的控制。我仍然需要使用VarToDateTime来转换表示月份的日期,而不是使用数值

var
  DateValue: TDateTime;

for i:= 1 to ParamCount do
begin
  // If we don't have a valid date see if it looks like a different
  // normal date field.
  if TryStrToDate(Param[i], DateValue) = false then
    continue; 

  // If the simple TryStrToDate does not work use the Variants function,
  // there is no "Try" version so catch the error here.
  try
    DateValue := VarToDateTime(Param[i]);
  except
    continue;
  end;

  // Use/Reformat DateValue here
 Param[i] := FormatDateTime('MM/DD/YYYY', DateValue);
end;
有关使用t格式设置的附加信息
如果将日期解释为首先列出日期或月份,则TFormatSettings参数可能会更改。如果未指定格式设置,则将使用操作系统默认设置。TryStrToDate查看短日期格式字符串,以确定预期的顺序。它查看第一个匹配字母的字符串格式,以确定可接受的格式:

case Chr(Ord(DateFormat[I]) and $DF) of
  'E': Result := doYMD;
  'Y': Result := doYMD;
  'M': Result := doMDY;
  'D': Result := doDMY;
下面是一个测试程序,可以向您显示差异。您可以基于区域设置创建FormatSettings,也可以直接设置短日期格式

procedure TForm7.Button3Click(Sender: TObject);
var
  s: string;
  d: TDateTime;
  FormatUS: TFormatSettings;
  FormatGB: TFormatSettings;
begin
  s := '5/10/2017';

  Memo1.Lines.Append('Testing GB');
  FormatGB := TFormatSettings.Create('en-GB');
  if TryStrToDate(s, d, FormatGB) = false then
  begin
    Memo1.Lines.Append(s + ' is not a valid date');
  end
  else
  begin
    Memo1.Lines.Append('Found Date: ' + FormatDateTime('dd MMMM YYYY', d));
    // will print: Found Date: 05 October 2017
  end;

  Memo1.Lines.Append('');
  Memo1.Lines.Append('Testing US');
  FormatUS := TFormatSettings.Create('en-US');
  if TryStrToDate(s, d, FormatUS) = false then
  begin
    Memo1.Lines.Append(s + ' is not a valid date');
  end
  else
  begin
    Memo1.Lines.Append('Found Date: ' + FormatDateTime('dd MMMM YYYY', d));
  end;

  Memo1.Lines.Append('');
  Memo1.Lines.Append('Testing with modified ShortDate Format');
  FormatUS.ShortDateFormat := 'yyyy/mm/dd';
  if TryStrToDate(s, d, FormatUS) = false then
  begin
    Memo1.Lines.Append(s + ' is not a valid date');
  end
  else
  begin
    Memo1.Lines.Append('Found Date: ' + FormatDateTime('dd MMMM YYYY', d));
  end;

end;
输出将显示:

测试GB
发现日期:2017年10月5日

测试我们
成立日期:2017年5月10日

使用修改的短日期格式进行测试
2017年5月10日不是有效日期


首先,您需要确定一个将字符串标识为日期的规则。你的规则是什么?“DavidHeffernan,它不是完整的证据,但我正在检查字符串,如果它包含‘/',那么我会把它当作一个日期。你怎么知道格式是DD/MM而不是MM/DD?或者换句话说,你必须知道原始日期的格式,因为你不能区分这两个。在这种情况下,您不需要进行任何日期字符串转换。您只需解析文本并使用字符串操作交换两个数字。我可以看到您正在使用字符串数组。。。我在问数据来自哪里。用户输入?来自其他系统或应用程序的文件?根据我的经验。。。如果用户,特别是公司用户,停止使用Excel等电子表格,就好像它们是某种数据库一样,那么像这样的问题就不存在了函数有一个可选的
t格式设置
参数,您可以/应该使用该参数指定要分析的日期/时间的格式。@RemyLebeau更新了代码,但仍然面临TryStrToDate()的问题无法识别'DD/MM/YYYY'格式的日期。@abhayk我更新了答案,以举例说明格式设置如何影响支持的日期格式。@MarkElder我已尝试输入上述日期,即2015年4月27日,如果循环不起作用。最后一行'Param[i]:=DateToStr(FormatDateTime('MM/DD/YYYY'),DateValue);'正在抛出错误,因为“没有可以用这些参数调用的“FormatDateTime”的重载版本”。仅仅因为您得到了答案,并不意味着应答者应该调试程序的其余部分。你为什么放弃了?你为什么不自己调试和思考呢?不要放弃。