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

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

詳細はこちら
Echo(フレームワーク)

Echoは、Go言語で作られたフレームワーク。非常に軽量で、小~中規模のアプリ構成を想定した仕様になっています。公式ドキュメントが用意されており、初心者でも始めやすい点が特徴です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

3回答

4122閲覧

[Go言語/Golang]返り値にtime.Time型を返す関数を作りたい。

Nave

総合スコア4

Echo(フレームワーク)

Echoは、Go言語で作られたフレームワーク。非常に軽量で、小~中規模のアプリ構成を想定した仕様になっています。公式ドキュメントが用意されており、初心者でも始めやすい点が特徴です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/02/19 14:12

編集2021/02/19 14:14

###実現したいこと
Goでコーディングをしている中で、下記の様な関数を実現する必要があります。
返り値はtime.Timeで実現したいです。(できればエラーとかも吐ける様にしたい)
フレームワークはEchoを使用しています。

const( ExpirationMonth = "month" ExpirationDay = "day" Forever = "forever" ForeverDate = //できれば9999年12月31日0時0分0秒をここに入れたい ) func getDate(dateType string, num int)time.Time{ if dateType == ExpirationMonth { return //今月の1日0時0分0秒からnum月進んだ数 } if dateType == ExpirationDay { //今日の10時からnum日進んだ数 } if dateType == Forever { return //9999年12月31日0時0分0秒 } return //nil的な何か(nilは指定できなかった) } func main() { date = "month" num = 3 result = getDate(date, num) printf(result) }

###分からないところ
①time.Time型での日付の計算
②返り値にどの様な値が入るべきか(nilなどは片違いで怒られてまうので)

定数にtime.Timeを入れるのとエラーを吐きたいのも書いていますが、これらはできたらやりたい程度です。
もし思いついたらこれらも教えて欲しいです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

エラーメッセージが不要な場合に限定すると、
処理失敗をゼロ値で伝える方法もアリかと思いました。
(ポインタ型で失敗したらnilを返すのと同じ手法)

https://play.golang.org/p/WXJl_BTDppr

go

1package main 2 3import ( 4 "fmt" 5 "time" 6) 7 8func GetNow() time.Time { 9 return time.Now() 10} 11 12func GetNowFailed() time.Time { 13 return time.Time{} 14} 15 16func main() { 17 t := GetNow() 18 fmt.Println(t.IsZero(), t) 19 t = GetNowFailed() 20 fmt.Println(t.IsZero(), t) 21}

投稿2021/02/21 23:49

nobonobo

総合スコア3367

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

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

0

ベストアンサー

こんにちは。2つの質問に対してお答えしました。
疑問点などあれば、お気軽にどうぞ。

1. time.Time型での日付の計算

Add()AddDate()などを使ってください。
詳しくは、timeパッケージのドキュメントを参照してください。
ドキュメント内でExampleが複数提示されているので、結構読みやすいと思います。

簡単な実装例を載せておきます。

go

1package main 2 3import ( 4 "fmt" 5 "math" 6 "time" 7) 8 9const ( 10 numMonths = 3 11 numDays = 23 12) 13 14func main() { 15 // 今の時刻を出力 16 // (Playground内の時刻はリアルタイムではない) 17 var now time.Time = time.Now() 18 fmt.Println(now) 19 20 // numMonths月進んだ時刻を出力 21 var numMonthsAfter time.Time = now.AddDate(0, numMonths, 0) 22 fmt.Println(numMonthsAfter) 23 24 // numDays日進んだ時刻を出力 25 var numDaysAfter time.Time = now.AddDate(0, 0, numDays) 26 fmt.Println(numDaysAfter) 27 28 // 時刻の最大値を出力 29 var maxLimitTime time.Time = time.Unix(math.MaxInt64, 0) 30 fmt.Println(maxLimitTime) 31} 32 33// Output: 34// 2009-11-10 23:00:00 +0000 UTC m=+0.000000001 35// 2010-02-10 23:00:00 +0000 UTC 36// 2009-12-03 23:00:00 +0000 UTC 37// 292277026596-12-04 15:30:07 +0000 UTC

2.返り値にどの様な値が入るべきか(nilなどは片違いで怒られてまうので)

nilを返したい場合は、getDate()の実行を失敗したと捉えることが出来ると思います。そのため、返り値の第二引数としてerrorを返してあげるのが良いと思いました。

GoPlaygroundのサンプルコードを載せておきます。

go

1package main 2 3import ( 4 "fmt" 5 "log" 6 "math" 7 "os" 8 "time" 9) 10 11const ( 12 ExpirationMonth = "month" 13 ExpirationDay = "day" 14 Forever = "forever" 15) 16 17var ForeverDate = time.Unix(math.MaxInt64, 0) //できれば9999年12月31日0時0分0秒をここに入れたい 18 19func getDate(dateType string, num int) (time.Time, error) { 20 if dateType == ExpirationMonth { 21 return time.Now().AddDate(0, num, 0), nil //今日からnum月進んだ数 22 } 23 if dateType == ExpirationDay { 24 return time.Now().AddDate(0, 0, num), nil //今日からnum日進んだ数 25 } 26 if dateType == Forever { 27 return time.Unix(math.MaxInt64, 0), nil //9999年12月31日0時0分0秒 28 } 29 return time.Time{}, fmt.Errorf("failed to getDate(%s, %d)", dateType, num) //nil的な何か(nilは指定できなかった) 30} 31 32func main() { 33 date := "month" 34 num := 3 35 result, err := getDate(date, num) 36 if err != nil { 37 log.Printf("failed to getDate: %s", err.Error()) 38 os.Exit(1) 39 } 40 log.Println(result) 41 42 // 実行に失敗するケース 43 _, err = getDate("hogefugapiyo", num) 44 if err != nil { 45 log.Printf("failed to getDate: %s", err.Error()) 46 os.Exit(1) 47 } 48 49} 50 51// Output: 52// 2009/11/10 23:00:00 2010-02-10 23:00:00 +0000 UTC 53// 2009/11/10 23:00:00 failed to getDate: failed to getDate(hogefugapiyo, 3)

※2021/02/21 9:21追記

①日にち単位での計算の時に、その日の10時からN日といったカウントを実現したいので、nowを設定するときにその日の10時と設定する方法も知っていたら教えて欲しいなと思っています!

time.Date()の引数にtime.Now()を入れれば良いと思います。
Playgroundのサンプルコード

go

1package main 2 3import ( 4 "fmt" 5 "log" 6 "time" 7) 8 9func main() { 10 now := time.Now() 11 // func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time 12 // 10時を明示的に指定 13 tenOClock := time.Date(now.Year(), now.Month(), now.Day(), 10, 0, 0, 0, time.Local) 14 15 fmt.Println(now) 16 fmt.Println(tenOClock) 17 18 // サーバの環境情報がJSTになってない場合は、明示的にJSTを指定する 19 jst, err := time.LoadLocation("Asia/Tokyo") 20 if err != nil { 21 log.Fatalf("failed to LoadLocation: %s", err.Error()) 22 } 23 fmt.Println(tenOClock.In(jst)) 24} 25 26// Output: 27// 2009-11-10 23:00:00 +0000 UTC m=+0.000000001 28// 2009-11-10 10:00:00 +0000 UTC 29// 2009-11-10 19:00:00 +0900 JST

②ForeverDateですが、本当のMaxというよりは9999年12月31日0時0分0秒でセットしたいので、その方法でも教えて欲しいです!

同様に、time.Date()で日付を設定してください。

Playgroundのサンプルコード

go

1package main 2 3import ( 4 "fmt" 5 "log" 6 "time" 7) 8 9func main() { 10 // func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time 11 // ForeverDateを明示的に指定 12 foreverDate := time.Date(9999, 12, 31, 0, 0, 0, 0, time.Local) 13 14 fmt.Println(foreverDate) 15 16 // サーバの環境情報がJSTになってない場合は、明示的にJSTを指定する 17 jst, err := time.LoadLocation("Asia/Tokyo") 18 if err != nil { 19 log.Fatalf("failed to LoadLocation: %s", err.Error()) 20 } 21 foreverDateJST := time.Date(9999, 12, 31, 0, 0, 0, 0, jst) 22 fmt.Println(foreverDateJST) 23} 24 25// Output: 26// 9999-12-31 00:00:00 +0000 UTC 27// 9999-12-31 00:00:00 +0900 JST

投稿2021/02/20 03:49

編集2021/02/21 00:38
task4233

総合スコア106

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

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

Nave

2021/02/20 23:05

回答ありがとうございます!! 疑問に思っていたことはほとんど回答してもらった内容で解決したので、ベストアンサーにさせていただきました! もし差し支えなければもう少し聞きたいのですが、 ①日にち単位での計算の時に、その日の10時からN日といったカウントを実現したいので、nowを設定するときにその日の10時と設定する方法も知っていたら教えて欲しいなと思っています! ②ForeverDateですが、本当のMaxというよりは9999年12月31日0時0分0秒でセットしたいので、その方法でも教えて欲しいです!
task4233

2021/02/21 00:38

追記しました。
Nave

2021/02/21 05:59

丁寧な回答ありがとうございます! 全て解決しました????
guest

0

①日にち単位での計算の時に、その日の10時からN日といったカウントを実現したいので、nowを設定するときにその日の10時と設定する方法も知っていたら教えて欲しいなと思っています!

②ForeverDateですが、本当のMaxというよりは9999年12月31日0時0分0秒でセットしたいので、その方法でも教えて欲しいです!

Go

1package main 2 3import( 4 "fmt" 5 "time" 6) 7 8func main(){ 9 now := time.Now() 10 japan := time.FixedZone("JST", int((9 * time.Hour).Seconds())) 11 t := time.Date(now.Year(), now.Month(), 10, 0, 0, 0, 0, japan) // [1] 12 fmt.Println(t) 13 max := time.Date(9999, 12, 31, 0, 0, 0, 0, japan) // [2] 14 fmt.Println(max) 15}

投稿2021/02/21 00:26

episteme

総合スコア16612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問