diff --git a/README.md b/README.md index d67efc5..71723aa 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ pairing with smart people at Hashrocket. For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186). -_1537 TILs and counting..._ +_1538 TILs and counting..._ --- @@ -405,6 +405,7 @@ _1537 TILs and counting..._ - [Combine Two Slices](go/combine-two-slices.md) - [Do Something N Times](go/do-something-n-times.md) - [Find Executables Installed By Go](go/find-executables-installed-by-go.md) +- [Format Date And Time With Time Constants](go/format-date-and-time-with-time-constants.md) - [Not So Random](go/not-so-random.md) - [Parse A String Into Individual Fields](go/parse-a-string-into-individual-fields.md) - [Parse Flags From CLI Arguments](go/parse-flags-from-cli-arguments.md) diff --git a/go/format-date-and-time-with-time-constants.md b/go/format-date-and-time-with-time-constants.md new file mode 100644 index 0000000..56b2229 --- /dev/null +++ b/go/format-date-and-time-with-time-constants.md @@ -0,0 +1,51 @@ +# Format Date And Time With Time Constants + +The Go [`time` package](https://pkg.go.dev/time) has a [`Format` +function](https://pkg.go.dev/time#Time.Format) for displaying the parts of a +date and time in standard and custom ways. It works a bit different than you +might be used to from other languages. Rather than using `strftime` identifiers +like in this string `"%B %d, %Y"`, there is a canonical date that is used as a +reference point. + +That canonical date is from Janary 2nd, 2006. That was a Monday. It was at 5 +seconds after 3:04PM. The Unix format of it looks like `"Mon Jan _2 15:04:05 +MST 2006"`. + +``` +package main + +import ( + "fmt" + "time" +) + +func main() { + // This specific time pulled from `time.Format` docs + t, _ := time.Parse(time.UnixDate, "Wed Feb 25 11:06:39 PST 2015") + + // Reference date and time: + // "Mon Jan _2 15:04:05 MST 2006" + + strf1 := t.Format("|2006|02|01|03:04:05|Day: Mon|") + fmt.Println("strf1:", strf1) + // strf1: |2015|25|02|11:06:39|Day: Wed| + + strf2 := t.Format(time.DateTime) + strf3 := t.Format(time.RubyDate) + strf4 := t.Format(time.Kitchen) + + fmt.Println("DateTime:", strf2) // DateTime: 2015-02-25 11:06:39 + fmt.Println("RubyDate:", strf3) // RubyDate: Wed Feb 25 11:06:39 +0000 2015 + fmt.Println("Kitchen:", strf4) // Kitchen: 11:06AM +} +``` + +Though there are a [variety of useful formatting +constants](https://pkg.go.dev/time#pkg-constants) already available like +`DateTime`, `RubyDate`, `Kitchen`, etc., we can also define our own formatting +string by using the reference values for each part of a date and time. + +If you want to reference the year, whether as `YYYY` or `YY`, it is always +going to be a form of `2006`, so `2006` or `06` respectively. Even though the +above time variable is in February, our format strings will always need to use +one of `Jan`, `January`, `01` or `1`.