2017-09-01 17 views
0

私はDelphi7を使用しています。Delphi-7:yyyymmdd形式の文字列(区切り記号なしの形式)をDateTimeオブジェクトに変換します

私はyyyymmddに設定されています(区切りなしの任意の日付形式を取ることができます)。私が試みるときStrToDate('20170901')それは間違いを投げている。

は、私は(異なるゾーンに異なるクライアントで使用することができます。)

私はVarToDateTimeで試してみましたが、それはまた、動作していないすべての有効な日付フォーマットをサポートします。

DateToStr()にも同じ問題がある場合は、それも私を案内してください。

+0

@LURD:間違いなく、詳細を更新しました。可能であれば、マイナスのマーキングを削除してください。少なくとも私の解決策を得ることができます。前もって感謝します。 –

+0

このような文字列の要素を、例えばCopyを使用して取り出すことは非常に自明です。次に、それらをStrToIntに渡してからEncodeDateに渡すことができます。 –

+0

@DavidHeffernan:システムの地域設定が「2019年9月1日」に変更された場合はどうなりますか?私はすべての可能なフォーマットの世話をする必要があります。 –

答えて

4

文字列をTDateTimeに変換するには、文字列を年、月、日の各コンポーネントに分割し、EncodeDate()関数に渡します。

var 
    myStr: string; 
    myDate: TDate; 
begin 
    myStr := '20170901'; 
    myDate := EncodeDate(
    StrToInt(Copy(MyStr, 1, 4)), 
    StrToInt(Copy(MyStr, 5, 2)), 
    StrToInt(Copy(MyStr, 7, 2)) 
); 
    ... 
end; 
+0

残念ながら、あなたは文字列の1から始まるインデックスを考慮に入れませんでした。文字列の変数を使用しないことは弱いです。最後に、質問者はこれ以上のことをしたいと思っていますが、質問は不明です。 –

+0

それは彼の問題を解決する方法の提案でしたが、もちろん彼はベストプラクティスを適用することができます。私は素人です。 – WellingtonD

+0

あなたは私のコメントの詳細を無視しました –

5

入力文字列が日付/時刻文字列の地域設定に一致しないため、エラーが発生しています。

uses 
    ..., SysUtils; 

var 
    OldShortDateFormat: string; 
    OldDateSeparator: Char; 
    input: string; 
    dt: TDateTime; 
begin 
    input := ...; 

    OldShortDateFormat := ShortDateFormat; 
    OldDateSeparator := DateSeparator; 
    ShortDateFormat := 'yyyymmdd'; // or whatever format you need... 
    DateSeparator := '/'; // or whatever you need 
    try 
    dt := StrToDate(input); 
    finally 
    ShortDateFormat := OldShortDateFormat; 
    DateSeparator := OldDateSeparator; 
    end; 

    // use dt as needed... 
end; 

通常は、私は事前にそのグローバルShortDateFormatDateSeparator変数を設定し、SysUtils単位でStrToDate()機能を使用することをお勧めして、後でそれらを復元なり、例えば(デルファイ7はTFormatSettingsレコードの導入に先行します) (20170901

は残念ながら、StrToDate()は日付コンポーネント(すなわち2017/09/01)の間の区切りを持つように入力文字列が必要ですが、あなたの入力文字列にはありません。 StrToDate()ShortDateFormatにセパレータが指定されていない場合でも、文字列を解析するときにDateSeparator#0に設定することはできません。

は、だからそれはオプションを1つだけ残し - 例えば、SysUtils単位でEncodeDate()機能を使用し、個々の成分を抽出するために、手動で文字列を解析し、:

uses 
    ..., SysUtils; 

var 
    wYear, wMonth, wDay: Word; 
    input: string; 
    dt: TDateTime; 
begin 
    input := ...; 

    wYear := StrToInt(Copy(input, 1, 4)); 
    wMonth := StrToInt(Copy(input, 5, 2)); 
    wDay := StrToInt(Copy(input, 7, 2)); 
    // or in whatever order you need... 

    dt := EncodeDate(wYear, wMonth, wDay); 

    // use dt as needed... 
end; 

DateToStr()機能も地域の設定の対象となります。ただし、出力でDateSeparatorを省略することができます。だから、次のいずれかを実行できます

  1. 利用目的の形式にグローバルShortDateFormat変数を設定DateToStr()、:

    uses 
        ..., SysUtils; 
    
    var 
        OldShortDateFormat: string; 
        dt: TDateTime; 
        output: string; 
    begin 
        dt := ...; 
    
        OldShortDateFormat := ShortDateFormat; 
        ShortDateFormat := 'yyyymmdd'; // or whatever format you need... 
        try 
        output := DateToStr(dt); 
        finally 
        ShortDateFormat := OldShortDateFormat; 
        end; 
    
        // use output as needed... 
    end; 
    
  2. SysUtils単位でDecodeDate()機能を使用してTDateTimeから個々の日付成分を抽出年と月/日の値を使用して独自の文字列をフォーマットします。

    uses 
        ..., SysUtils; 
    
    var 
        wYear, wMonth, wDay: Word; 
        dt: TDateTime; 
        output: string; 
    begin 
        dt := ...; 
    
        DecodeDate(dt, wYear, wMonth, wDay); 
        output := Format('%.4d%.2d%.2d', [wYear, wMonth, wDay]); 
    
        // use output as needed... 
    end; 
    
+0

非常に良いアプローチは、2番目の – WellingtonD

関連する問題