github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/time/time.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // パッケージtimeは時間を測定し表示する機能を提供します。 6 // 7 // 暦の計算は常にグレゴリオ暦を前提としており、閏秒は考慮しません。 8 // 9 // # モノトニッククロック 10 // 11 // オペレーティングシステムは「壁掛け時計(wall clock)」と「モノトニッククロック(monotonic clock)」の2つを提供しています。壁掛け時計はクロック同期により変更される可能性がありますが、モノトニッククロックは変更されません。一般的なルールは、壁掛け時計は時刻を表示するために使用し、モノトニッククロックは時間を測定するために使用することです。このパッケージでは、time.Nowが返すTimeには壁掛け時計の読み取り結果とモノトニッククロックの読み取り結果の両方が含まれています。後の時刻表示操作は壁掛け時計の読み取り結果を使用し、後の時間測定操作(比較や差分の計算など)はモノトニッククロックの読み取り結果を使用します。 12 // 13 // たとえ壁掛け時計が操作中に変更された場合でも、以下のコードは常に約20ミリ秒の経過時間を計算します。 14 // 15 // start := time.Now() 16 // ... 20ミリ秒かかる処理 ... 17 // t := time.Now() 18 // elapsed := t.Sub(start) 19 // 20 // time.Since(start)、time.Until(deadline)、time.Now().Before(deadline)などの他のイディオムも、壁掛け時計のリセットに対して同様に頑健です。 21 // 22 // このセクションの残りの部分では、操作がモノトニッククロックを使用する方法の詳細を述べますが、これらの詳細を理解することはこのパッケージの使用には必要ありません。 23 // 24 // time.Nowが返すTimeにはモノトニッククロックの読み取り結果が含まれています。Time tがモノトニッククロックの読み取り結果を持つ場合、t.Addは壁掛け時計とモノトニッククロックの読み取り結果の両方に同じ期間を加算して結果を計算します。t.AddDate(y, m, d)、t.Round(d)、t.Truncate(d)は壁掛け時計の計算なので、結果からモノトニッククロックの読み取り結果は常に除去されます。t.In、t.Local、t.UTCは壁掛け時計の解釈への影響のために使用されますが、結果からモノトニッククロックの読み取り結果も常に除去されます。モノトニッククロックの読み取り結果を除去する正確な方法は、t = t.Round(0)を使用することです。 25 // 26 // tとuのいずれもモノトニッククロックの読み取り結果を含む場合、t.After(u)、t.Before(u)、t.Equal(u)、t.Compare(u)、t.Sub(u)は壁掛け時計の読み取り結果を無視してモノトニッククロックの読み取り結果だけを使用して実行されます。tまたはuのいずれかがモノトニッククロックの読み取り結果を含まない場合、これらの操作は壁掛け時計の読み取り結果を使用します。 27 // 28 // 一部のシステムでは、コンピューターがスリープモードに入るとモノトニッククロックが停止することがあります。そのようなシステムでは、t.Sub(u)はtとuの間で経過した実際の時間を正確に反映しない場合があります。 29 // 30 // モノトニッククロックの読み取り結果には、現在のプロセスの外部では意味がありません。t.GobEncode、t.MarshalBinary、t.MarshalJSON、t.MarshalTextによって生成されるシリアル化された形式では、モノトニッククロックの読み取り結果は省略され、t.Formatはそれに対するフォーマットを提供しません。同様に、コンストラクタtime.Date、time.Parse、time.ParseInLocation、およびtime.Unix、およびアンマーシャラーt.GobDecode、t.UnmarshalBinary、t.UnmarshalJSON、およびt.UnmarshalTextは常にモノトニッククロックの読み取り結果のない時刻を作成します。 31 // 32 // モノトニッククロックの読み取り結果はTimeの値にのみ存在します。Durationの値やt.Unixおよび関連する関数が返すUnix時刻には含まれていません。 33 // 34 // Goの==演算子は、時間の瞬間だけでなく、位置情報とモノトニッククロックの読み取り結果も比較します。Time型の等値テストについては、Time型のドキュメントを参照してください。 35 // 36 // デバッグ用に、t.Stringの結果には、存在する場合はモノトニッククロックの読み取りが含まれます。 37 // t != uの場合、異なるモノトニッククロックの読み取りによって、t.String()とu.String()の出力に差異が見られます。 38 // 39 // # タイマーの解像度 40 // 41 // タイマーの解像度は、Goランタイム、オペレーティングシステム、 42 // および基礎となるハードウェアによって異なります。 43 // Unixでは、解像度は約1msです。 44 // Windowsバージョン1803以降では、解像度は約0.5msです。 45 // 古いWindowsバージョンでは、デフォルトの解像度は約16msですが、 46 // [golang.org/x/sys/windows.TimeBeginPeriod] を使用して高解像度を要求することができます。 47 package time 48 49 // Timeは納秒単位の精度で時刻を表します。 50 // 51 // Timeを使用するプログラムでは通常、値として保存し、渡すべきです。 52 // つまり、時刻変数や構造体のフィールドは*time.Timeではなくtime.Timeの型であるべきです。 53 // 54 // Timeの値は、GobDecode、UnmarshalBinary、UnmarshalJSON、UnmarshalTextメソッドを除いて、 55 // 複数のゴルーチンで同時に使用できます。 56 // 57 // Timeの瞬間はBefore、After、Equalメソッドを使って比較することができます。 58 // Subメソッドは2つの瞬間を引いてDurationを生成します。 59 // AddメソッドはTimeとDurationを足してTimeを生成します。 60 // 61 // Time型のゼロ値は、UTCでの1年1月1日00:00:00.000000000です。 62 // この時刻は実際にはほとんど使われないため、IsZeroメソッドは明示的に初期化されていない時刻を検出するための簡単な方法です。 63 // 64 // 各時刻には関連するLocationがあります。Local、UTC、およびInメソッドは、特定のLocationを持つTimeを返します。 65 // これらのメソッドを使用してTime値のLocationを変更しても、それが表す実際の瞬間は変更されず、解釈するタイムゾーンのみが変更されます。 66 // 67 // GobEncode、MarshalBinary、MarshalJSON、MarshalTextメソッドによって保存されるTime値の表現には、Time.Locationのオフセットが格納されますが、 68 // 場所の名前は格納されません。そのため、夏時間に関する情報が失われます。 69 // 70 // 必要な「壁時計」の読み取りに加えて、Timeにはオプションのプロセスの単調な時計の読み取りが含まれることがあります。 71 // 比較や減算のための追加の精度を提供するためです。 72 // 詳細については、パッケージのドキュメントの「単調な時計」のセクションを参照してください。 73 // 74 // Goの==演算子は、時刻の瞬間だけでなく、Locationと単調な時計の読み取りも比較します。 75 // そのため、Timeの値は、まずすべての値に同じLocationが設定されていることを保証してから、 76 // マップやデータベースのキーとして使用するべきではありません。これはUTCまたはLocalメソッドの使用によって実現でき、 77 // 単調な時計の読み取りはt = t.Round(0)と設定することで削除する必要があります。 78 // 一般的には、t.Equal(u)をt == uよりも優先し、t.Equalは最も正確な比較を使用し、 79 // 1つの引数のみが単調な時計の読み取りを持つ場合のケースを正しく処理します。 80 type Time struct { 81 82 // wallとextは、壁時の秒、壁時のナノ秒、およびオプションの単調クロックの読み取り値(ナノ秒単位)をエンコードします。 83 // 上位から下位のビット位置に従い、wallは1ビットのフラグ(hasMonotonic)、33ビットの秒フィールド、および30ビットの壁時のナノ秒フィールドをエンコードします。 84 // ナノ秒のフィールドの範囲は[0, 999999999]です。 85 // hasMonotonicビットが0の場合、33ビットのフィールドはゼロでなければならず、完全な符号付きの64ビットの壁秒は、Jan 1 year 1からの時間がextに格納されます。 86 // hasMonotonicビットが1の場合、33ビットのフィールドは1885年1月1日以降の33ビットの符号なし壁秒を保持し、extはプロセスの開始からの時間が符号付きの64ビットの単調クロックの読み取り値(ナノ秒単位)を保持します。 87 wall uint64 88 ext int64 89 90 // locはTimeに対応する分、時、月、日、年を決定するために使用されるべき場所を指定します。 91 // nilの場所はUTCを意味します。 92 // すべてのUTC時刻はloc==nilで表され、loc==&utcLocではありません。 93 loc *Location 94 } 95 96 // tがuより後の時刻であるかどうかを報告します。 97 func (t Time) After(u Time) bool 98 99 // Beforeは、時刻tがuよりも前であるかどうかを報告します。 100 func (t Time) Before(u Time) bool 101 102 // Compare関数は時刻tとuを比較します。tがuより前の場合は-1を返し、tがuより後の場合は+1を返します。同じである場合は0を返します。 103 func (t Time) Compare(u Time) int 104 105 // Equalは、tとuが同じ瞬間を表しているかどうかを報告します。 106 // 異なる場所にある場合でも、2つの時刻が等しい場合があります。 107 // たとえば、6:00 +0200と4:00 UTCはEqualです。 108 // Timeのドキュメントを参照して、==を使用する際の注意点を確認してください。 109 // ほとんどのコードはEqualを使用する必要があります。 110 func (t Time) Equal(u Time) bool 111 112 // Monthは年の月を指定します(1月= 1、...)。 113 type Month int 114 115 const ( 116 January Month = 1 + iota 117 February 118 March 119 April 120 May 121 June 122 July 123 August 124 September 125 October 126 November 127 December 128 ) 129 130 // Stringは月の英語名(「January」、「February」、...)を返します。 131 func (m Month) String() string 132 133 // Weekdayは、週の日を指定します(日曜日 = 0、...)。 134 type Weekday int 135 136 const ( 137 Sunday Weekday = iota 138 Monday 139 Tuesday 140 Wednesday 141 Thursday 142 Friday 143 Saturday 144 ) 145 146 // Stringは日の英語名("Sunday", "Monday", ...)を返します。 147 func (d Weekday) String() string 148 149 // IsZero は t がゼロのタイムインスタント(西暦1年1月1日00:00:00 UTC)を表すかどうかを報告します。 150 func (t Time) IsZero() bool 151 152 // Dateはtが発生する年、月、日を返します。 153 func (t Time) Date() (year int, month Month, day int) 154 155 // Yearはtが発生する年を返します。 156 func (t Time) Year() int 157 158 // Month は t で指定された年の月を返します。 159 func (t Time) Month() Month 160 161 // Dayはtによって指定された月の日を返します。 162 func (t Time) Day() int 163 164 // Weekdayはtに指定された曜日を返します。 165 func (t Time) Weekday() Weekday 166 167 // ISOWeekは、tが発生するISO 8601の年と週番号を返します。 168 // 週は1から53までの範囲です。年nの1月1日から1月3日は年n-1の週52または53に属する場合があり、12月29日から12月31日は年n+1の週1に属する場合があります。 169 func (t Time) ISOWeek() (year, week int) 170 171 // Clock 関数は、t で指定された日の時間、分、秒を返します。 172 func (t Time) Clock() (hour, min, sec int) 173 174 // Hourはtで指定された日の中の時間を返します。範囲は[0, 23]です。 175 func (t Time) Hour() int 176 177 // Minuteは時間tで指定された時間内の分のオフセットを、[0、59]の範囲で返します。 178 func (t Time) Minute() int 179 180 // Secondは、tで指定された分の中の2番目のオフセットを、[0, 59]の範囲で返します。 181 func (t Time) Second() int 182 183 // Nanosecondはtで指定された秒の中でのナノ秒オフセットを[0, 999999999]の範囲で返します。 184 func (t Time) Nanosecond() int 185 186 // YearDay は与えられた t によって指定される年の日を返します。 187 // 非閏年の場合、範囲は [1, 365] であり、閏年の場合は [1, 366] です。 188 func (t Time) YearDay() int 189 190 // Durationは2つの瞬間の経過時間をint64ナノ秒カウントとして表します。 191 // この表現は、最大表現可能な期間を約290年に制限しています。 192 type Duration int64 193 194 // 共通の期間です。Dayやそれ以上の単位の定義はありません。 195 // 夏時間ゾーンの移行時に混乱を避けるためです。 196 // 197 // Durationの単位数を数えるには、次のように割ります: 198 // 199 // second := time.Second 200 // fmt.Print(int64(second/time.Millisecond)) // 1000と出力されます 201 // 202 // 整数の単位数をDurationに変換するには、次のように掛けます: 203 // 204 // seconds := 10 205 // fmt.Print(time.Duration(seconds)*time.Second) // 10sと出力されます 206 const ( 207 Nanosecond Duration = 1 208 Microsecond = 1000 * Nanosecond 209 Millisecond = 1000 * Microsecond 210 Second = 1000 * Millisecond 211 Minute = 60 * Second 212 Hour = 60 * Minute 213 ) 214 215 // Stringは、期間を「72h3m0.5s」という形式の文字列で返します。 216 // 先頭のゼロ単位は省略されます。特別なケースとして、1秒未満の期間は、先頭の数字が0以外になるように、より小さな単位(ミリ秒、マイクロ秒、ナノ秒)を使用してフォーマットされます。ゼロ期間は「0s」としてフォーマットされます。 217 func (d Duration) String() string 218 219 // Nanosecondsは、期間を整数のナノ秒数として返します。 220 func (d Duration) Nanoseconds() int64 221 222 // Microsecondsは、整数のマイクロ秒数として期間を返します。 223 func (d Duration) Microseconds() int64 224 225 // Millisecondsは、期間を整数のミリ秒カウントとして返します。 226 func (d Duration) Milliseconds() int64 227 228 // Secondsは、秒単位の浮動小数点数としての期間を返します。 229 func (d Duration) Seconds() float64 230 231 // Minutesは、分単位の浮動小数点数としての期間を返します。 232 func (d Duration) Minutes() float64 233 234 // Hoursは時間を浮動小数点数として返します。 235 func (d Duration) Hours() float64 236 237 // Truncate は d を 0 に向かって丸めた結果を、m の倍数にして返します。 238 // もし m <= 0 であれば、Truncate は d をそのまま返します。 239 func (d Duration) Truncate(m Duration) Duration 240 241 // Round関数は、dを最も近いmの倍数に丸めた結果を返します。 242 // 半分の値の丸め方は、ゼロから離れるように丸めます。 243 // 結果がDurationに格納できる最大(または最小)値を超える場合、 244 // Round関数は最大(または最小)のdurationを返します。 245 // m <= 0の場合、Round関数はdをそのまま返します。 246 func (d Duration) Round(m Duration) Duration 247 248 // Absはdの絶対値を返します。 249 // 特別なケースとして、math.MinInt64はmath.MaxInt64に変換されます。 250 func (d Duration) Abs() Duration 251 252 // Addは時間tにdを加えた時間を返します。 253 func (t Time) Add(d Duration) Time 254 255 // Subは期間t-uを返します。結果がDurationに格納できる最大値(または最小値)を超える場合、最大(または最小)の期間が返されます。 256 // 期間dのt-dを計算するためには、t.Add(-d)を使用してください。 257 func (t Time) Sub(u Time) Duration 258 259 // Since(t)は、tから経過した時間を返します。 260 // これはtime.Now().Sub(t)の省略形です。 261 func Since(t Time) Duration 262 263 // Untilはtまでの時間を返します。 264 // これはt.Sub(time.Now())の省略形です。 265 func Until(t Time) Duration 266 267 // AddDateはtに指定された年数、月数、日数を加算した時間を返します。 268 // 例えば、2011年1月1日にAddDate(-1, 2, 3)を適用すると、 269 // 2010年3月4日が返されます。 270 // 271 // 日付は基本的にタイムゾーンに結び付けられており、日などの暦期間には固定された期間がありません。 272 // AddDateは、Time値のLocationを使用してこれらの期間を決定します。 273 // つまり、同じAddDate引数でも、基本となるTime値とそのLocationに応じて、絶対時間のシフトが異なる場合があります。 274 // たとえば、3月27日の12:00に適用されるAddDate(0、0、1)は常に3月28日の12:00を返します。 275 // 一部の場所や年では、これは24時間のシフトです。他の場所や年では、夏時間の移行により23時間のシフトです。 276 // 277 // AddDateはDateと同じように結果を正規化します。 278 // つまり、10月31日に1ヶ月を追加すると11月31日となり、 279 // これは正規化されたフォームである12月1日になります。 280 func (t Time) AddDate(years int, months int, days int) Time 281 282 // 現在のローカル時間を返します。 283 func Now() Time 284 285 // UTCは場所をUTCに設定したtを返します。 286 func (t Time) UTC() Time 287 288 // Local は t の位置をローカルの時間に設定して返します。 289 func (t Time) Local() Time 290 291 // In は、同じ時刻インスタンスを表す t のコピーを返しますが、表示目的でコピーの場所情報を loc に設定します。 292 // 293 // loc が nil の場合、In はパニックを発生させます。 294 func (t Time) In(loc *Location) Time 295 296 // Locationは、tに関連付けられたタイムゾーン情報を返します。 297 func (t Time) Location() *Location 298 299 // Zone関数は、時刻tに有効なタイムゾーンを計算し、タイムゾーンの省略名(「CET」など)とUTCから東へのオフセットを秒単位で返します。 300 func (t Time) Zone() (name string, offset int) 301 302 // ZoneBoundsは、時刻tに有効なタイムゾーンの範囲を返します。 303 // ゾーンはstartで始まり、次のゾーンはendで始まります。 304 // ゾーンが時間の開始時点で始まる場合、startはゼロの時間として返されます。 305 // ゾーンが永遠に続く場合、endはゼロの時間として返されます。 306 // 返された時間の場所はtと同じになります。 307 func (t Time) ZoneBounds() (start, end Time) 308 309 // UnixはtをUnix時刻として返します。これは1970年1月1日UTCからの経過秒数です。結果はtに関連付けられた場所に依存しません。 310 // Unix系のオペレーティングシステムはしばしば時間を32ビットの秒数として記録しますが、ここで返される値は64ビットのため、過去や未来の数十億年に対しても有効です。 311 func (t Time) Unix() int64 312 313 // UnixMilliはtをUnix時刻として返します。つまり、1970年1月1日UTCから経過したミリ秒の数です。int64で表現できない(1970年より292万年以上前または後の日付)場合、結果は未定義です。結果はtに関連付けられた場所に依存しません。 314 func (t Time) UnixMilli() int64 315 316 // UnixMicroは、tをUnix時間として返します。これは、1970年1月1日UTCから経過したマイクロ秒の数です。int64で表現できない場合(年-290307以前または年294246以降の日付)、結果は未定義です。結果は、tに関連付けられた場所に依存しません。 317 func (t Time) UnixMicro() int64 318 319 // UnixNanoはtをUnix時刻として返します。これは、1970年1月1日UTCから経過したナノ秒数です。Unix時刻がint64で表現できない場合(1678年以前または2262年以降の日付)、結果は未定義です。なお、これはゼロのTimeに対してUnixNanoを呼び出した結果も未定義であることを意味します。結果はtに関連付けられた場所に依存しません。 320 func (t Time) UnixNano() int64 321 322 // MarshalBinaryはencoding.BinaryMarshalerインターフェースを実装します。 323 func (t Time) MarshalBinary() ([]byte, error) 324 325 // UnmarshalBinaryはencoding.BinaryUnmarshalerインターフェースを実装します。 326 func (t *Time) UnmarshalBinary(data []byte) error 327 328 // GobEncodeはgob.GobEncoderインターフェースを実装します。 329 func (t Time) GobEncode() ([]byte, error) 330 331 // GobDecodeはgob.GobDecoderインターフェースを実装します。 332 func (t *Time) GobDecode(data []byte) error 333 334 // MarshalJSONはjson.Marshalerインターフェースを実装します。 335 // 時刻はRFC 3339形式で引用符で囲まれた文字列です。秒未満の精度もあります。 336 // タイムスタンプが有効なRFC 3339として表現できない場合 337 // (例:年が範囲外の場合)、エラーが報告されます。 338 func (t Time) MarshalJSON() ([]byte, error) 339 340 // UnmarshalJSONはjson.Unmarshalerインターフェースを実装します。 341 // 時刻はRFC 3339形式でクォートされた文字列である必要があります。 342 func (t *Time) UnmarshalJSON(data []byte) error 343 344 // MarshalTextはencoding.TextMarshalerインターフェースを実装します。 345 // 時間はRFC 3339形式でサブ秒の精度でフォーマットされます。 346 // タイムスタンプが有効なRFC 3339として表現できない場合(例:年が範囲外の場合)、エラーが報告されます。 347 func (t Time) MarshalText() ([]byte, error) 348 349 // UnmarshalTextはencoding.TextUnmarshalerインターフェースを実装します。 350 // 時刻はRFC 3339形式である必要があります。 351 func (t *Time) UnmarshalText(data []byte) error 352 353 // Unixは、与えられたUnix時刻に対応する現地時刻を返します。 354 // secは1970年1月1日UTCからの秒数であり、nsecはナノ秒単位です。 355 // nsecは[0、999999999]の範囲外を指定することもできます。 356 // すべてのsec値に対応する時間値が存在するわけではありません。そのような値の一つは1 << 63-1(最大のint64値)です。 357 func Unix(sec int64, nsec int64) Time 358 359 // UnixMilliは与えられたUnix時刻に対応するローカルの時刻を返します。 360 // 1970年1月1日UTCからのミリ秒で表されます。 361 func UnixMilli(msec int64) Time 362 363 // UnixMicroは、与えられたUnix時間に対応するローカル時間を返します。 364 // usecは1970年1月1日UTCからのマイクロ秒です。 365 func UnixMicro(usec int64) Time 366 367 // IsDSTは、設定された場所の時刻が夏時間(Daylight Savings Time)かどうかを報告します。 368 func (t Time) IsDST() bool 369 370 // Date関数は、与えられた場所と時間に対応するTimeZoneでの、 yyyy-mm-dd hh:mm:ss + nsecナノ秒のTimeを返します。 371 // 372 // 月、日、時、分、秒、nsecの値は通常の範囲外である場合でも、変換中に正規化されます。 373 // 例えば、10月32日は11月1日に変換されます。 374 // 375 // 夏時間の変遷では、一部の時間が飛ばされたり、繰り返されることがあります。 376 // 例えば、アメリカ合衆国では、2011年3月13日の2時15分は存在せず、 377 // 2011年11月6日の1時15分は2回存在します。そのような場合、 378 // タイムゾーンの選択、つまり時間が明確でなくなります。 379 // Date関数は、変遷に関与する2つのタイムゾーンのうちの1つで正確な時間を返しますが、 380 // どちらかは保証されません。 381 // 382 // locがnilの場合、Date関数はパニックを発生させます。 383 func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time 384 385 // Truncate関数は、tをd(ゼロ時点からの倍数)に切り捨てた結果を返します。 386 // もしd <= 0の場合、Truncateはmonotonicなクロックの読み取りを除いたtを返しますが、それ以外は変更されません。 387 // 388 // Truncateは、時間をゼロ時点からの絶対経過時間として操作します。 389 // 時間の表現形式ではなく、時刻を操作します。したがって、Truncate(Hour)は、 390 // 時刻のLocationに依存して、非ゼロの分を持つ時刻を返す場合があります。 391 func (t Time) Truncate(d Duration) Time 392 393 // Roundはtを最も近いdの倍数に丸めた結果を返します(ゼロ時からの経過時間を使います)。 394 // 半分の値の丸め方は切り上げです。 395 // d <= 0の場合、Roundはtをモノトニックな時計読み取りを除いて変更せずに返します。 396 // 397 // Roundは時間の表示形式ではなく、ゼロ時からの絶対経過時間として動作します。 398 // したがって、Round(Hour)は時間のLocationによって非ゼロの分を持つことがあります。 399 func (t Time) Round(d Duration) Time