2017-12-05 12 views
2

다음과 같이 문자열 배열이 있습니다.델파이에서 MM/DD/YYYY 형식으로 날짜를 표시하는 방법

Param : array[1..5] of string = ('US','Dollor','27/03/2017','IND','INR'); 

날짜가 포함 된 문자열을 찾아 MM/DD/YYYY 형식으로 지정해야합니다. 이 작업을 수행하려면 루프를 실행하고 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; 

날짜 TryStrToDate 이해 할 수없는, 그래서 [] DD/MM은/년에 다음과 같이한다. 코드를 어떻게 바꿀 수 있습니까? 이 최종 결과는 다음과 아래와 같이 마크의 솔루션을 사용

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; 
+0

먼저 문자열을 날짜로 식별하는 규칙을 결정해야합니다. 당신의 규칙은 무엇입니까? –

+0

@DavidHeffernan 그 전체 증거가 아니지만 문자열을 확인하고 있는데, '/'가 포함되어 있으면 날짜로 간주합니다. – abhayk

+3

형식이 MM/DD가 아닌 DD/MM임을 어떻게 알 수 있습니까? –

답변

5

TryStrToDate은 TDateTime으로 타입으로 문자열을 변환하려고하는 델파이 라이브러리 기능입니다. 내 코드에는 TryStrToDate 함수에서 허용하지 않는 일부 형식이 허용되었습니다. 첫 번째 메서드가 실패하면 해당 날짜를 변환하려면 VarToDateTime을 호출합니다. 이는 추가 형식을 지원하는 변형 함수를 호출합니다.

레미가 언급 한대로 TFormatSettings 유형의 옵션 매개 변수가 있으며 허용되는 형식을 일부 제어 할 수 있습니다. 나는 숫자 값을 사용하는 대신 월을 철자로 한 날짜를 변환하기 위해 VarToDateTime을 사용해야했습니다. 날짜가 일 먼저 나열 월을로 해석되는 경우 사용 TFormatSettings

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; 

추가 정보는 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
을 찾을 수 날짜 : 수정 ShortDate와 2017년 5월 10일

테스트 : 2017년 10월 5일

테스트 미국
찾을 수 날짜 형식
5/10/2017은 (는) 잘못된 날짜입니다.

+1

'(Try) StrTo (Date | Time)'함수는 구문 분석하고자하는 날짜/시간의 형식을 지정하기 위해 사용할 수 있거나 사용할 수있는 선택적인'TFormatSettings' 매개 변수를 가지고 있습니다. –

+0

TryStrToDate()가 'DD/MM/YYYY'형식으로 날짜를 인식 할 수 없으므로 @RemyLebeau가 코드를 업데이트했지만 여전히 문제가 있습니다. – abhayk

+0

@abhayk TFormatSettings가 지원되는 날짜 형식에 어떤 영향을 줄 수 있는지 예를 들어 답을 업데이트했습니다. –