質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3107閲覧

Pythonでの文字列<-->日付(datetime)

gomakichi

総合スコア17

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/10/24 01:58

前提・実現したいこと

現在Pythonを使って現在日時を取得する処理を書いています。

datetimeオブジェクトのnow()メソッドで得られた日時から時間のみを切り取って再度datetime型で使用したいと思っています。

例) 現在が2017年10月20日17:35:38.123456ならば
→整形後に2017-10-20にしたいという状況です。

しかし、

発生している問題・エラーメッセージ

print(date_str) >>>2017-10-20

上記のように、取得した日時をstring型に変換した際は希望通りの値が取れているですが、

print(date_dat) >>>2017-10-20 00:00:00

その値を再度datetime型に変換すると時間まで取得されてしまい困っています。

該当のソースコード

date_now = datetime.now() date_str = date_now.strftime('%Y-%m-%d') print(date_str) date_dat = datetime.strptime(date_str, '%Y-%m-%d') print(date_dat)

最終的にはdatetime型の値をHTML側に渡して表示したいのですが、どうしたら良いでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

strptimeは文字列からdatetime型に変換した結果を返します。
datetime型は、日付と時刻も保持しています。
これをそのままprintすると、内部でdatetime型の__str__関数が呼び出されてデフォルトの書式に従って文字列に変換されます。このときの文字列には時刻部分も含まれます。

よって、strftimeにて書式を指定して希望の文字列(str)型に変換する必要があります。

Python

1from datetime import datetime 2 3date_now = datetime.now() 4 5# 明示的に年月日の文字列に変換 6date_str = date_now.strftime('%Y-%m-%d') 7print(type(date_str)) # <class 'str'> 8print(date_str) # 2017-10-24 9 10# 文字列からdatetime型に変換 11date_dat = datetime.strptime(date_str, '%Y-%m-%d') 12print(type(date_dat)) # <class 'datetime.datetime'> 13print(date_dat) # 2017-10-24 00:00:00 14 15# ↑のprintでは以下の結果が出力されている 16s = date_dat.__str__() 17print(type(s)) # <class 'str'> 18print(s) # 2017-10-24 00:00:00 19 20 21# 明示的に年月日の文字列に変換 22date_str = date_dat.strftime('%Y-%m-%d') 23print(type(date_str)) # <class 'str'> 24print(date_str) # 2017-10-24

投稿2017/10/24 02:20

can110

総合スコア38252

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gomakichi

2017/10/24 07:17

回答ありがとうございます。 最終的にはdatetime型で値を取得したいため、datetime.strptime(date_str, '%Y-%m-%d')のような処理を行なっています。 しかし、datetime型では時刻も表示されてしまうため、時刻部分をカットしたいと考えています。 しかし、あくまでdate型を使用するのではなく、データベースに保存する際は今後の拡張性を考えて時間部分まで取得しておきたいと思っています。 意図が伝わりにくかったらすみません。
can110

2017/10/24 07:56 編集

質問(やりたいこと)の意図がうまくくみ取れているか自信がありませんが… datetime型の変数は文字列ではないので、print関数での出力やHTML処理の時には文字列に変換した値を利用する必要があります。 print(date_dat)では内部で自動的に(__str__関数で)変換した結果(文字列値)が生成され、その文字列値が出力されているだけです。 datetime型の変数値からどのような形式の文字列を変換(生成)すべきかは、本来はstrftimeによってユーザーが決める必要があります。
gomakichi

2017/10/24 11:21

striftimeでカットした時間要素がstriptimeで再度変換する際は、datetime型なので00:00:00.000000が追加されてしまうのですかね。 ありがとうございます。試してみます。
can110

2017/10/25 08:38

たとえstriftimeで年月日のみ指定してdatetime型を生成しても、実は「つねに時刻要素も(0として)持ってしまう」とご理解ください。それがdatetime型の性質です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問