1

こんにちは、future_date変数を設定して、今日から90日後の日付を表示したいと思います。

set $future_date ""
#set $future_date to date in unixtime stamp 90 days from the current timestamp

tclでそれを行うことはできますか?

4

2 に答える 2

5

それを行う方法は、以下を使用することclock addです。

# The [clock seconds] produces _now_
set future_date [clock add [clock seconds] 90 days]
set future_readable [clock format $future_date]

OK、その通りです。まず、一部の地域では約半年は機能しません。問題?DSTの変更があり、1日の長さが実際には一定ではないことを意味します(場合によっては、市民の日は23時間または25時間の長さです)。ただし、このような修正を適用するには、現在のタイムゾーンに関する知識が必要です(世界のさまざまな地域でさまざまなルールがあるため)。タイムゾーンは、zoneinfoデータベースを参照して指定されます。

set zone ":America/New_York"
set future_date [clock add [clock seconds] 90 days -timezone $zone]
set future_readable [clock format $future_date -timezone $zone]
# Normally should use the same timezone for each *unless* there's a
# business reason to do otherwise...

2番目の問題は、うるう秒が無視されることです。GPSソフトウェアや同等の感度のあるものを作成していない場合は、これがおそらくまさにあなたが望むものです(そして、本当に気にかけているのであれば、とにかく修正を適用するための適切なソフトウェア/アルゴリズムを持っているでしょう)。

3番目の問題は、これが8.5以降でのみ機能することです(clockコマンドが実質的にゼロから書き直されたとき。時間処理で他のすべてのバグに対処するのに飽きて、自分たちだけのものにすることにしました!) 8.4(またはそれ以前!)次に、別の昆虫が必要です。

set future_date [clock scan "now + 90 days"]
set future_readable [clock format $future_date]

これは、タイムゾーンの処理が正しく行われず(現在のシステムタイムゾーンを使用する、UTC [*]を使用する可能性があります)、非常に非自明なタイムストリングパーサーの上に構築されているため、お勧めできません。それでも、8.5より前の最良のオプションです。


[*]これがどれほど奇妙になるかを過小評価しないでください。サードパーティのプリンタードライバーのバグに対処したことを覚えています。このバグは、Windowsの別のプロセスに読み込まれると、印刷の実行が完了するまで、実行中のすべてのアプリケーションのシステムタイムゾーンを変更します。実際に何が起こっているのかを確認することさえ困難でした(後で私の顎を床から持ち上げたように)。

于 2012-06-05T00:18:57.080 に答える
2

Tclでは、clock secondsコマンドは現在の時刻を秒単位で返します。これに90日を追加するには、90に60(1分あたりの秒数)、60(1時間あたりの分数)、および24(1日あたりの時間数)を掛ける必要があります。

set today [clock seconds]
set future [expr {$today + 90 * 60 * 60 * 24}]
puts [clock format $today -format "Today is %B %m, %Y"]
puts [clock format $future -format "90 days from today is %B %m, %Y"]

clock詳細については、コマンドを検索してください。

于 2012-06-04T20:50:52.077 に答える