tattyan3
@tattyan3 (tatsuji shimo)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

GMT形式で時間を自由に変えて表したい「python」

なぜか止まる。

print(str(gmt_0_m)+' test<br>\n')

全文

#!c:/Python3/python -X utf8
# coding=utf-8

#######################################################################################
# DATA   2024/02/11 エポック標準時刻を表示する
# this script        http://127.0.0.1/my_python/python_time1.cgi
#
########################################################################################

# test on *.py
#! /usr/bin/env python3
#  -*- coding: utf-8 -*-
#
point_err = bool(1)
point_return = bool(0)
settig_msgA = 'NO Settig.'
settig_msgB = 'NO Settig.'
error_detail = 'No Error.'
def my_error(error_detail):
    if point_err:
        print ("Content-type:text/html\n\n")
        print ('<!DOCTYPE html><html lang=\"ja\"><head><meta charset=\"UTF-8\"><title>omikuji Error</title></head><body>')
    print ('<h1>エラー発生(An error has occurred.)</h1><h2>detail :'+error_detail+'</h2><div style=\"background-color: #000066;color: #cccccc;font-size: 12px;margin: 3px;padding: 3px;\">'+settig_msgA+'</div><div style=\"background-color: #006600;color: #cccccc;font-size: 12px;margin: 3px;padding: 3px;\">'+settig_msgB+'</div><br>')
    if point_return:
        return
    print ('</body></html>\n')
    exit()
######################################  この間はprint出力はerrorとなるので my_error("test") を使うこと ##################
# my_error('オープン前エラー Occurrence before opening <b>test.</b>')

import datetime

print ('Content-type:text/html'+'\n'+'\n')
print ('<!DOCTYPE html><html lang=\"ja\"><head><meta charset=\"UTF-8\"><title>pyton_v5</title>'+'\n')
# print ('<link rel=\"stylesheet\" href=\"popupw_css.css\">'+'\n')
print ('<script src=\"python_time.js\" defer></script>'+'\n')
print ('</head><BODY BGCOLOR=\"#ffffff\">'+'\n')
point_err = bool(0) #ここから後はヘッダータグを打ち出さなくていい。########### printをここから使える ######################
point_return = bool(1) #回帰復帰on
print ('エポック標準時の比較<br>\n')

now = datetime.datetime.now()
#my_date = now.strftime("%Y/%m/%d %H:%M:%S")
my_year = int(now.strftime("%Y"))-1970

my_month = int(now.strftime("%m"))-1
my_day = int(now.strftime("%d"))-1
my_hour =int(now.strftime("%H"))
my_minute = int(now.strftime("%M"))
my_second = int(now.strftime("%S"))

def_moon_days = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]
def_moon_days4 = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]

if my_year%4 == 0:
    my_moon_days = def_moon_days4[my_month]
else:
    my_moon_days = def_moon_days[my_month]

epoch_tokyo = 9
print("1:javascript<div id=\"mymy\"></div>\n")
my_year2 = int(my_year/4)
epoch_0 = my_year*365*24*60*60 + (my_moon_days + my_day+my_year2)*24*60*60 + (my_hour-epoch_tokyo)*60*60 + my_minute*60 + my_second
print("2:python計算<div id=\"mymy1\">",epoch_0,"</div>\n")
print("3:差<div id=\"mymy2\"></div>\n")

print('<br>\n')
epoch_1 = epoch_0 + 9*60*60
print(epoch_1," Epo_tokyo<br>\n")

# UTC -> time format
#	my	(@cpairs, $cname, $cvalue, $value);
#	if ($cookie_clr == 1){$COOKIE_LIFE = -1;}
	# %COOKIEを単一のクッキー値にエンコード
#	foreach $cname (keys %COOKIE) {
#		$cvalue = $COOKIE{$cname};
#		$cvalue =~ s/(\W)/sprintf("%%%02X", ord $1)/eg;
#		push @cpairs, "$cname#$cvalue";
#	}
#	$value = join('&', @cpairs);

#	# グリニッジ標準時の文字列
##	my	@mon_str = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
##	my	@wdy_str = qw(Sun Mon Tue Wed Thu Fri Sat);
##	my	$life = $COOKIE_LIFE * 24 * 60 * 60;
##	my	($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime(time + $life);
##	my	$date = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",$wdy_str[$wday],$mday,$mon_str[$mon],$year + 1900,$hour,$min,$sec);

##	$coprint = "Set-Cookie: $COOKIE_NAME=$value; expires=$date\n";

# mon_str = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
wdy_str = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']

gmt_0_y = int(epoch_0 / (365*24*60*60))  #1970+0y

wike0 =  (int(epoch_0 / (24*60*60)) + 4) % 7
week_gmt = wdy_str[wike0]           ######
gmt_00_m = epoch_0 - (gmt_0_y*365*24*60*60 + (gmt_0_y -1)*24*60*60)
nit = 24*60*60
my_moon_days00 = [0, 31*nit, 59*nit, 90*nit, 120*nit, 151*nit, 181*nit, 212*nit, 243*nit, 273*nit, 304*nit, 334*nit]
my_moon_days04 = [0, 31*nit, 60*nit, 91*nit, 121*nit, 152*nit, 182*nit, 213*nit, 244*nit, 274*nit, 305*nit, 335*nit]
my_moon_days0 = [0, 31*nit, 59*nit, 90*nit, 120*nit, 151*nit, 181*nit, 212*nit, 243*nit, 273*nit, 304*nit, 334*nit]
if gmt_0_y % 4 == 0:
    my_moon_days0 = [0, 31*nit, 60*nit, 91*nit, 121*nit, 152*nit, 182*nit, 213*nit, 244*nit, 274*nit, 305*nit, 335*nit]
#else:
#    my_moon_days0= my_moon_days00
print('test '+str(gmt_0_y)+' week_gmt '+week_gmt+'<br>\n')
print('test '+str(my_moon_days0[0]) +' day'+str(gmt_00_m)+'<br>\n')

year_gmt = str(gmt_0_y + 1970)           ######

print('',year_gmt,'<br>\n')

my_m_max = 0
if gmt_00_m >= my_moon_days0[0]:
    my_m_max = my_moon_days0[0]
if gmt_00_m >= my_moon_days0[1]:
    gmt_0_m += 1
    my_m_max = my_moon_days0[1]
if gmt_00_m >= my_moon_days0[2]:
    gmt_0_m += 1
    my_m_max = my_moon_days0[2]
if gmt_00_m >= my_moon_days0[3]:
    gmt_0_m += 1
    my_m_max = my_moon_days0[3]
if gmt_00_m >= my_moon_days0[4]:
    gmt_0_m += 1
    my_m_max = my_moon_days0[4]
if gmt_00_m >= my_moon_days0[5]:
    gmt_0_m += 1
    my_m_max = my_moon_days0[5]
if gmt_00_m >= my_moon_days0[6]:
    gmt_0_m += 1
    my_m_max = my_moon_days0[6]
if gmt_00_m >= my_moon_days0[7]:
    gmt_0_m += 1
    my_m_max = my_moon_days0[7]
if gmt_00_m >= my_moon_days0[8]:
    gmt_0_m += 1
    my_m_max = my_moon_days0[8]
if gmt_00_m >= my_moon_days0[9]:
    gmt_0_m += 1
    my_m_max = my_moon_days0[9]
if gmt_00_m >= my_moon_days0[10]:
    gmt_0_m += 1
    my_m_max = my_moon_days0[10]
if gmt_00_m >= my_moon_days0[11]:
    gmt_0_m += 1
    my_m_max = my_moon_days0[11]
#my_error('test')
mon_str = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
print('0'+mon_str[0]+'<br>\n')
print(str(gmt_0_m)+' test<br>\n')
moon_gmt = mon_str[gmt_0_m]          #####
print('moon',moon_gmt,'0_m',str(gmt_0_m),'<br>\n')
gmt_0_d = int((gmt_00_m - (gmt_0_m*24*60*60))/(24*60*60))  #0day
day_gmt = str(gmt_0_d +1)                 #####
gmt_0_t = (gmt_00_m - gmt_0_m*24*60*60) - (gmt_0_d*24*60*60) #hms
gmt_0_h = int(gmt_0_t/(60*60))    #h
hour_gmt = str(gmt_0_h)                   #####
t_m_0 = gmt_0_t - gmt_0_h*60*60
gmt_0_m = int(t_m_0/60)           #M
minutes_gmt = str(gmt_0_m)                #####
gmt_0_s = t_m_0- gmt_0_m*60       #s
second_gmt = str(gmt_0_s)                 #####
print('GMT date<br>\n')
print(week_gmt+','+day_gmt+'-'+moon_gmt+'-'+year_gmt+' '+hour_gmt+':'+minutes_gmt+':'+second_gmt+' GMT')
print('<br>\n')

print ('</BODY>'+'\n')
print ('</HTML>'+'\n')
exit()

訳が分かりません、時間ばかりかかってます。
当方、初心者につき、名前付けのルールと言うものを、理解しきれていません。

1

2Answer

pythonコマンドで実行してみたところ、「変数名 gmt_0_m が定義されていない」というエラーが表示されました。
変数を初期化していないか変数名を間違っているのではありませんか?

エラー内容
Traceback (most recent call last):
  File "/mnt/c/Users/qiita/t.py", line 153, in <module>
    print(str(gmt_0_m)+' test<br>\n')
              ^^^^^^^
NameError: name 'gmt_0_m' is not defined. Did you mean: 'gmt_0_y'?

自分で複雑な計算をしなくても、GMT形式で時間を自由に変えて表せますよ。

from datetime import datetime, timezone

tokyo = datetime.now()
gmt = datetime.now(timezone.utc)

print(f"Tokyo: {tokyo:%a,%d-%b-%Y %H:%M:%S}")
print(f"GMT  : {gmt:%a,%d-%b-%Y %H:%M:%S}")
pythonコマンドで実行した結果
Tokyo: Wed,14-Feb-2024 02:07:55
GMT  : Tue,13-Feb-2024 17:07:55

2Like

Comments

  1. @tattyan3

    Questioner

    これに、地域差-17:00時間とか、cookie+302460*60(30日)を足した時の時間をcookieは必要とするからです。

  2. 上のリンク先にもあるようにtimedeltaが使えるのでその程度で自前計算は必要ないですね…

  3. from datetime import datetime, timezone, timedelta
    
    gmt = datetime.now(timezone.utc)
    tokyo = gmt + timedelta(hours=+9)
    local = gmt + timedelta(hours=-17)
    cookie = gmt + timedelta(days=30)
    
    print(f"GMT   : {gmt:%a,%d-%b-%Y %H:%M:%S}")
    print(f"Tokyo : {tokyo:%a,%d-%b-%Y %H:%M:%S}")
    print(f"local : {local:%a,%d-%b-%Y %H:%M:%S}")
    print(f"cookie: {cookie:%a,%d-%b-%Y %H:%M:%S}")
    
    実行結果
    GMT   : Thu,15-Feb-2024 01:39:12
    Tokyo : Thu,15-Feb-2024 10:39:12
    local : Wed,14-Feb-2024 08:39:12
    cookie: Sat,16-Mar-2024 01:39:12
    
  4. Windows11のcopilotにも聞いてみました。

    自分:
    pythonで30日後の日時を表示するコードを書いてください。

    Copilot:
    もちろんです!Pythonで30日後の日時を表示するためには、datetime モジュールを使用します。以下にいくつかの方法を示します。

    1.現在の日時から30日前の日時を計算する方法:
    Python

    from datetime import datetime, timedelta
    
    # 現在の日時を取得
    current_datetime = datetime.now()
    
    # 30日前の日時を計算
    thirty_days_ago = current_datetime - timedelta(days=30)
    
    print("30日前の日時:", thirty_days_ago)
    
    AI で生成されたコード。ご確認のうえ、慎重にご使用ください。FAQ で詳細を確認。
    

    2.指定した日時から30日後の日時を計算する方法:
    Python

    from datetime import datetime, timedelta
    
    # 指定した日時(例:2023年1月1日)を作成
    specified_date = datetime(2023, 1, 1)
    
    # 30日後の日時を計算
    thirty_days_later = specified_date + timedelta(days=30)
    
    print("指定した日時から30日後の日時:", thirty_days_later)
    
    AI で生成されたコード。ご確認のうえ、慎重にご使用ください。FAQ で詳細を確認。
    

    どちらの方法でも、30日後の日時を正確に計算できます。選択肢に応じて、適切な方法を選んでください。

  5. @tattyan3

    Questioner

    埋め込み変数として扱うにはどうするのですか?cookieで、改行のない変数として扱いたいのですが。

  6. 埋め込み変数として扱うにはどうするのですか?cookieで、改行のない変数として扱いたいのですが。

    再三にわたって文字列フォーマットして出力する方法を提示されていると思いますが,具体的に埋め込み変数なる用語が何を指しているか補足していただけますか?
    お言葉ではありますが少々前提知識が不足しておられるように思います.

  7. from datetime import datetime, timezone, timedelta
    
    gmt = datetime.now(timezone.utc)
    cookie = f"{gmt + timedelta(days=30):%a,%d-%b-%Y %H:%M:%S}"
    print(cookie)
    
    実行結果
    Sat,16-Mar-2024 02:01:27
    
  8. @tattyan3

    Questioner

    最後に基本形式である「 GMT」がついていないんです。今テスト中。

  9. from datetime import datetime, timezone, timedelta
    
    utc = datetime.now(timezone.utc)
    gmt = datetime.now(timezone(timedelta(0), 'GMT'))
    jst = datetime.now(timezone(timedelta(hours=9), 'JST'))
    cookie_utc = f"{utc + timedelta(days=30):%a,%d-%b-%Y %H:%M:%S %Z}"
    cookie_gmt = f"{gmt + timedelta(days=30):%a,%d-%b-%Y %H:%M:%S %Z}"
    cookie_jst = f"{jst + timedelta(days=30):%a,%d-%b-%Y %H:%M:%S %Z}"
    print(cookie_utc)
    print(cookie_gmt)
    print(cookie_jst)
    
    実行結果
    Sat,16-Mar-2024 05:47:35 UTC
    Sat,16-Mar-2024 05:47:35 GMT
    Sat,16-Mar-2024 14:47:35 JST
    
  10. @tattyan3

    Questioner

    お宅ねぇUTC理解してないですよ。12345678というような数字で表す時間ですよ。

  11. UTC≠Unix Time
    用語を正確に覚えること

  12. from datetime import datetime, timezone, timedelta
    
    utc = datetime.now(timezone.utc)
    print(int(utc.timestamp()))
    
    実行結果
    1707976755
    

    GMT と Z は、航法や通信の分野で UTC と同義語として認められる

    時刻の最大精度を整数秒で扱う場合はGMTと世界時 (UT) はUTC の意味で使用され、GMTはUTCまたはUTに置換して表す。

    timezone.utc
        UTC タイムゾーン timezone(timedelta(0)) です。
    

総括

#!c:/Python3/python -X utf8
# coding=utf-8

#######################################################################################
# DATA   2024/02/11 エポック標準時刻を表示する
# this script        http://127.0.0.1/my_python/python_time_soukatu.cgi
# ok.
########################################################################################

# test on *.py
#! /usr/bin/env python3
#  -*- coding: utf-8 -*-
#
point_err = bool(1)
point_return = bool(0)
settig_msgA = 'NO Settig.'
settig_msgB = 'NO Settig.'
error_detail = 'No Error.'
def my_error(error_detail):
    if point_err:
        print ("Content-type:text/html\n\n")
        print ('<!DOCTYPE html><html lang=\"ja\"><head><meta charset=\"UTF-8\"><title>omikuji Error</title></head><body>')
    print ('<h1>エラー発生(An error has occurred.)</h1><h2>detail :'+error_detail+'</h2><div style=\"background-color: #000066;color: #cccccc;font-size: 12px;margin: 3px;padding: 3px;\">'+settig_msgA+'</div><div style=\"background-color: #006600;color: #cccccc;font-size: 12px;margin: 3px;padding: 3px;\">'+settig_msgB+'</div><br>')
    if point_return:
        return
    print ('</body></html>\n')
    exit()
######################################  この間はprint出力はerrorとなるので my_error("test") を使うこと ##################
# my_error('オープン前エラー Occurrence before opening <b>test.</b>')

print ('Content-type:text/html'+'\n'+'\n')
print ('<!DOCTYPE html><html lang=\"ja\"><head><meta charset=\"UTF-8\"><title>python_time</title>'+'\n')
# print ('<link rel=\"stylesheet\" href=\"popupw_css.css\">'+'\n')
print ('<script src=\"python_time.js\" defer></script>'+'\n')
print ('</head><BODY BGCOLOR=\"#ffffff\">'+'\n')

point_err = bool(0) #ここから後はヘッダータグを打ち出さなくていい。########### printをここから使える ######################
point_return = bool(1) #回帰復帰on

from datetime import datetime, timezone, timedelta
# from zoneinfo import ZoneInfo

# timezone_tokyo = ZoneInfo('Asia/Tokyo')
# now_utc = datetime.now(timezone.utc)
# now_tokyo = datetime.fromtimestamp(now_utc.timestamp(), timezone_tokyo)
# epoch_utc = int(now_utc.timestamp())
# epoch_tokyo = epoch_utc + timezone_tokyo.utcoffset(now_tokyo).seconds

gmt = datetime.now(timezone.utc)
cookie = f"{gmt + timedelta(days=30):%a,%d-%b-%Y %H:%M:%S} GMT"

print ('エポック標準時の比較<br>\n')
print("0:javascript<div id=\"mymy0\"></div>\n")
print("1:javascript<div id=\"mymy\"></div>\n")
print("2:python計算出来ません。<div id=\"mymy1\">0</div>\n")
print("3:差<div id=\"mymy2\"></div>\n")
print("4:cookie 30day after="+cookie+" Is All<br>\n")

tokyo = gmt + timedelta(hours=+9)
local = gmt + timedelta(hours=-17)

#print(epoch_tokyo, 'Epo_tokyo<br>\n')
print(f"{tokyo:%a, %d-%b-%Y %H:%M:%S} GMT-Tokyo"+"<br>\n")
print(f"{local:%a, %d-%b-%Y %H:%M:%S} GMT-San_Francisco"+"<br>\n")

print("All Over?<br>\n")
print ('</BODY>'+'\n')
print ('</HTML>'+'\n')
exit()

エポッックタイムのCGI出力が不可のため他への受け渡しが不可能。
4:cookieの先頭に余分な"sp"が入ってる。
単独で使うなら、総じてOKです。
ありがとうございました。何もなければ、本日で閉めます。

0Like

Comments

  1. 4:cookieの先頭に余分な"sp"が入ってる。

    まず調べることをおすすめします.

    print()関数の引数に複数の変数および文字列や数値などをカンマ区切りで指定すると、デフォルトではスペース(空白)で区切られて出力される。

    プログラミングというのは応用ができねぇと何も出来ない分野です.根本的にPythonでCGIを書くという前世代感もそうですが,前提となる勉強が圧倒的に足りていないように思います.ドキュメントを読めば一発で解決するような質問ほどトラブルシューティングにおいてしょうもないのはありませんし,ぶっちゃけこのコード見て総括と銘打たれてはホントに回答をご理解いただけているか非常に怪しいので,とにかくまず勉強してください.
    分かった気になるくらいなら不明点を詳細に言語化して体裁を整えて質問してください.

  2. @tattyan3

    Questioner

    UTCとGMTはもっと等しくはないはずです。

  3. だからなんだと言われるようなこと書く前に勉強しろっつってんですよ
    まともな答えがつかないのは知識がねえからじゃなくて知識がないことを自覚できねえからなんですよ
    話が通じてないことをどうかご認識ください

  4. @tattyan3

    Questioner

    だからと言って、受け渡し後Splitして、再編成しなきゃならない事には、ならないでしょう?

  5. その通り.デシリアライズの手間を省くためにGMT表記にするのは正しいんだ.
    じゃあどうやったらGMT形式で出力できるかというのは既に散々回答されてるんだ.
    言ってる事わかる????

  6. print(f"4:cookie 30day after={cookie} Is All<br>\n")
    
  7. @tattyan3

    Questioner

    そんなことしなくったって

    print("4:cookie 30day after="+cookie+" Is All<br>\n")
    

    で、十分じゃないですか? 難しく考えすぎ?

  8. お好きな方でどうぞ。

    print(f"4:cookie 30day after={cookie} Is All<br>\n")
    print("4:cookie 30day after="+cookie+" Is All<br>\n")
    

    f-strings は文字列以外にも使えるのが便利。

    value = 123
    print(f"value is {value}")
    print("value is "+str(value))
    
  9. @tattyan3

    Questioner

    参考までに。int()の桁数が足りない時は、str()で出して、将来倍精度に対応した時に、備えるが賢いやり方では、ないでしょうか? 個人的な意見で他意はありません。

  10. Pythonのintは可変長整数で桁数は無制限です。(メモリサイズ次第)

    >>> 1 + 999999999999999999999999999999999999999999999999999999999999999999999
    1000000000000000000000000000000000000000000000000000000000000000000000
    >>> 2 ** 1024
    179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216
    
  11. @tattyan3

    Questioner

    最後の桁は「6」だから、+1は出来ますよね?互換性見たらですが…。

  12. >>> x = 2 ** 1024
    >>> x += 1
    >>> x
    179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137217
    
  13. 脱線ついでですが、bool(0)bool(1) は一般的な書き方ではないので、標準的な FalseTrue に書き換えた方がいいと思います。

  14. @tattyan3

    Questioner

    いや、わかるよ。歳でスペルを覚えきれないのですよ。なんか、成立しないし。。。

  15. 基本中の基本なので覚えましょうよ。

    >>> bool(-1)
    True
    >>> bool(0)
    False
    >>> bool(1)
    True
    >>> bool(2)
    True
    >>> bool("")
    False
    >>> bool("hello")
    True
    >>> bool([])
    False
    >>> bool([1, 2, 3])
    True
    
  16. その辺はフロー制御としてやりたいことは分かるけど,まず現代高級言語として馴染まない書き方だと思います.
    どっちみち既にオフトピなのでなんかあったらまた質問立てることを推奨します.

  17. @tattyan3

    Questioner

    先は、短いし別にpython諦めても良いんだけと。インデントとか、注意しないと、難し過ぎるし。。。

Your answer might help someone💌