🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Python

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

Q&A

解決済

1回答

2098閲覧

和歴をstrptimeで西暦表記したい

tonk

総合スコア22

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Python

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

0グッド

0クリップ

投稿2019/09/30 21:28

お世話になります。
よろしくお願いいたします。

・ブラウザで日付を入力して期間計算を行うプログラムを作成しています。
・西暦と和暦に対応して柔軟に入力できるようにしたいと考えています。
・和暦は西暦に変換して計算しようとしてるのですが、strptimeによる年数入力は4桁以上にしか対応していないのでしょうか? 和暦+二桁年ではエラーが出て受け付けられません。

是非ご教示いただければと存じます。どうぞよろしくお願いいたします。

from bottle import route, run, template, request import datetime from dateutil import relativedelta as rd @route("/test",method="POST") def test(): test_str = request.forms.nengo_start d1_str = request.forms.start if test_str == "昭和": d1 = datetime.datetime.strptime(d1_str,"%Y/%m/%d") + rd.relativedelta(years=1925) elif test_str == "平成": d1 = datetime.datetime.strptime(d1_str,"%Y/%m/%d") + rd.relativedelta(years=1988) elif test_str == "令和": d1 = datetime.datetime.strptime(d1_str,"%Y/%m/%d") + rd.relativedelta(years=2019) return template("test",result=d1) run(host="localhost",port=8080,debug=True)

テンプレート側

<html> <body> <form method="post" action="/test" style="display:inline;"> <p style="display:inline;">開始年月日</p> <select name="nengo_start"> <option value="昭和">昭和</option> <option value="平成">平成</option> <option value="令和">令和</option> </select> <input type="text" name="start"> <br> <p style="display:inline;">終了年月日</p> <select name="nengo_end"> <option value="昭和">昭和</option> <option value="平成">平成</option> <option value="令和">令和</option> </select> <input type="text" name="end"> <br> <input type="submit" value="送信"> </form> {{result}} </body> </html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

2桁の西暦の場合は%yを使う・・・と言いたいのですが昭和63年を変換すると

Python

1>>> datetime.datetime.strptime('63/01/01', '%y/%m/%d') 2datetime.datetime(2063, 1, 1, 0, 0)

となってしまうのでやめたほうがいいと思います。文字列を'/'で分割してdatetimeを作ったほうがよいと思います。
こんな感じでしょうか

Python

1import datetime 2jc_to_ad = { '昭和':1925, '平成':1988, '令和':2019 } 3test_str ='令和' 4d1_str = '01/05/01' 5 6if test_str in jc_to_ad.keys(): 7 yymmdd = list(map(int, d1_str.split('/'))) 8 dl = datetime.datetime(jc_to_ad[test_str] + yymmdd[0], yymmdd[1], yymmdd[2]) 9else: 10 dl = None 11print(dl) 12#2020-05-01 00:00:00

投稿2019/09/30 22:59

nomuken

総合スコア1627

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

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

tonk

2019/10/01 21:55

ご回答ありがとうございます。 私のとは全く違う書き方で大変勉強になります。 重ねて教えていただきたいのですが、7行目のmap関数は何をしているのでしょうか? 01/05/01を数値化しているのは分かるのですが、map関数でどのような処理を経てlist化しているのでしょうか。
nomuken

2019/10/01 22:50

`d1_str.split('/')`は文字列のリストを返します。そして文字列リストの全要素に対してint関数を呼び出して数値リストにします。ただ、map関数はリストそのものではなく「mapオブジェクト」を返すのでlist関数でリストに戻します。 https://qiita.com/sus304/items/2b82666ebcadd3d6aceb
tonk

2019/10/02 21:33

たびたびのご回答ありがとうございます。 リンク先も拝見しました。なかなか理解も十分追いつけないのですが、 li = [] d1_str = "01/05/01" d1_li = d1_str.split("/") for day in d1_li: li.append(int(day)) 同様のことをforを用いたループ処理だと上記のようになりますが、より簡潔に行えるという理解でいいのでしょうか?
nomuken

2019/10/02 22:26

> より簡潔に行えるという理解でいいのでしょうか? はい。理解しにくいなら yymmdd_str = d1_str.split('/') dl = datetime.datetime(jc_to_ad[test_str] + int(yymmdd_str[0]), int(yymmdd_str[1]), int(yymmdd_str[2])) と書いてもいいです。やり方は自由です。
tonk

2019/10/03 23:18

ご回答ありがとうございます。 ↑の書き方が一番しっくりきたので使わせていただきました。 どうもありがとうございました。辞書の使い方も勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問