2017-06-23 15 views
0

私はdatetimeモジュールを使用して日付のチェックを行い、日付がmm/dd/yyyyまたはmm/dd/yyの形式であるかどうかを調べています。問題は、%dと%mのディレクティブが、月または日が1桁の桁であることを検出するのに十分な機密性がないことです。これは私の要件です。私はそれがしたいようなdatetime - 2桁の日数と月数はどのように必要ですか?

datetime.strptime('01/01/2001', '%m/%d/%Y') 

作品が、私は本当に、月と日は0が埋め込まれていない限り、それはとValueErrorをスローするようにしたいとき

datetime.strptime('1/1/2001', '%m/%d/%Y') 

も、有効な日時を生成します。誰でも日時フォーマットに必要な精度を設定する方法を知っていますか?これは可能ですか、代わりに正規表現を使うべきですか?

+1

これを確認してください:http://strftime.org/あなたがどのプラットフォームにいるかは重要です。 ''%-m /% - d /%Y '' – Nicarus

+1

残念ながら 'datetime'でこれを厳密にチェックすることはできません。関連する質問:[datetime.strptimeがゼロパディング10進数のみを解析する方法](https://stackoverflow.com/questions/33035441/how-to-let-datetime-strptime-parse-zero-padded-decimal-number -only) – Delgan

答えて

1

使用しているdatetime関数は、入力を検証するためのものではなく、文字列をdatetimeオブジェクトに変換するためのものです。両方の例は、datetimeまでの正当な文字列入力です。

あなたが特定の形式であることをユーザーの入力を強制したい場合、私は正規表現となるだろう - 私のREPLからこの例を参照してください。あなたがフォーマットされた日付を返す関数を定義する場合

>>> import re 
>>> pattern = re.compile(r"^[0-9]{2}/[0-9]{2}/[0-9]{4}$") 
>>> def valid_datestring(datestring): 
...  if pattern.match(datestring): 
...   return True 
...  return False 
... 
>>> valid_datestring('1/1/2001') 
False 
>>> valid_datestring('01/01/2001') 
True 

またはvalueErrorを返します。

def format_datestring(datestring): 
    if not valid_datestring(datestring): 
     raise ValueError('Date input must be in the form dd/mm/yyyy!') 
    return datetime.strptime(datestring, '%m/%d/%Y') 
+1

ええ、私はこれが当てはまると考えました。ちょうどdatetime形式で精度を設定することについてどこか読んだと思っていました。ありがとう、これは助け! – zyd

関連する問題