19

私は自分のブログをホストできるこの単純な Web サーバーを作成していますが、何をしても構いません。HTML/テンプレートに適切なフォーマットの時間を実行できません。

これが私がすることです:

私はこの構造体を作成しました:

type Blogpost struct {
    Title   string
    Content string
    Date    time.Time
}

次に、Appengine データストアから対応するタイトル/日付を含むブログ投稿を取得し、それをスライスとして返す、この小さな関数を作成しました。

func GetBlogs(r *http.Request, max int) []Blogpost {
    c := appengine.NewContext(r)
    q := datastore.NewQuery("Blogpost").Order("-Date").Limit(max)
    bp := make([]Blogpost, 0, max)
    q.GetAll(c, &bp)
    return bp
}

最後に、blogHandler で、次を使用して Appengine データストアから取得したデータに基づいてスライスを作成します。

blogs := GetBlogs(r, 10)

このようにブログというテンプレートを実行すると、ブログの日付がデフォルトの日付として解析されます。

blog.Execute(w, blogs) // gives dates like: 2013-09-03 16:06:48 +0000 UTC

だから、私は Golang n00b であり、次のような関数が私が望む結果をもたらすと言うでしょう

blogs[0].Date = blogs[0].Date.Format("02-01-2006 15:04:05") // Would return like 03-09-2013 16:06:48, at least when you print the formatted date that is.

ただし、その結果、もちろん型の競合が発生します。これを次を使用して解決しようとしました。

blogs[0].Date, _ = time.Parse("02-01-2006 15:04:05", blogs[0].Date.Format("02-01-2006 15:04:05")) // returns once again: 2013-09-03 16:06:48 +0000 UTC

それはおそらく私がもう一度見落としたものですが、time.Timeをオーバーライドできない方法がわかりません。スライスに入力するか、少なくとも必要な形式で出力してください。

4

3 に答える 3

69

time.Timeで型を単純にフォーマットしてレンダリングする同様の機能を探しているときに、go のテンプレート パーサーを使用すると、型をレンダリングするときに特定の制限html/templateの下でメソッドを呼び出すことができることを偶然発見しました。time.Time

例えば;

type Post struct {
    Id        int
    Title     string
    CreatedOn time.Time
}

// post is a &Post. in my case, I fetched that from a postgresql
// table which has a datetime column for that field and
// value in db is 2015-04-04 20:51:48

template.Execute(w, post)

以下のようなテンプレートでその時間を使用することができます。

<span>{{ .CreatedOn }}</span>
<!-- Outputs: 2015-04-04 20:51:48 +0000 +0000 -->

<span>{{ .CreatedOn.Format "2006 Jan 02" }}</span>
<!-- Outputs: 2015 Apr 04 -->

<span>{{ .CreatedOn.Format "Jan 02, 2006" }}</span>
<!-- Outputs: Apr 04, 2015 -->

<span>{{.CreatedOn.Format "Jan 02, 2006 15:04:05 UTC" }}</span>
<!-- Outputs: Apr 04, 2015 20:51:48 UTC -->

注意として; 私の行くバージョンはgo1.4.2 darwin/amd64

それが他の人に役立つことを願っています。

于 2015-04-11T16:24:45.963 に答える
39

あなたのDateフィールドのタイプはtime.Timeです。文字列としてフォーマットして解析すると、再びtime.Time値が得られますが、テンプレートの実行がそのStringメソッドを呼び出すときにデフォルトの方法で出力されるため、問題は実際には解決されません。

これを解決する方法は、時間値の代わりにフォーマットされた時間文字列自体をテンプレートに提供することです。これは複数の方法で行うことができます。例えば:

  • 名前付きまたは類似のブログ投稿タイプFormattedDateに、好みのスタイルで適切にフォーマットされた文字列を返すメソッドを追加します。これが最も簡単で、特別なユース ケースがない場合はおそらく最も優れた方法です。

  • FormattedDateという名前または類似のブログ タイプに文字列フィールドを追加します。これは上記のオプションと非常に似ていますが、必要に応じてフィールドを設定および更新するように注意する必要があるため、代わりにメソッド オプションを使用することをお勧めします。

  • テンプレート内で時間値を複数の方法でフォーマットしたい場合は、テンプレート フォーマッタ関数を定義して、 のようなことを行うこともできます{{post.Date | fdate "02-01-2006 15:04:05"}}その方法の詳細については、 Template.FuncsFuncMap タイプ、およびこの例のドキュメントを参照してください。

更新:最初のオプションのサンプル コード: http://play.golang.org/p/3QYdrDQ1YO

于 2013-09-03T19:24:46.020 に答える