time.Month în Go

Tipul pentru lunile anului, de la time.January (1) la time.December (12); String() dă numele englezesc.

Sintaxă
type Month int

const (
    January Month = 1 + iota
    February
    ...
    December
)

func (m Month) String() string

Ce face time.Month

time.Month este un număr întreg cu nume: time.January = 1 … time.December = 12. Îl primești de la t.Month() și îl dai lui time.Date. Pentru că este un int, îl poți compara (m >= time.June), aduna (m + 1) sau converti (time.Month(3)).

Metoda String() returnează numele în engleză ("October"); fmt.Println o apelează automat. Pentru numele românești folosește un tablou propriu indexat cu luna.

Ce returnează

String() returnează numele lunii în engleză sau %!Month(13) pentru valori în afara intervalului.

Exemple

Exemplul 1: Numere, nume și anotimpuri

package main

import (
	"fmt"
	"time"
)

var lunaRo = [...]string{"", "ianuarie", "februarie", "martie", "aprilie", "mai", "iunie",
	"iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"}

func anotimp(m time.Month) string {
	switch m {
	case time.December, time.January, time.February:
		return "iarnă"
	case time.March, time.April, time.May:
		return "primăvară"
	case time.June, time.July, time.August:
		return "vară"
	}
	return "toamnă"
}

func main() {
	m := time.October
	fmt.Println(m, int(m), m.String())
	fmt.Println("În română:", lunaRo[m], "-", anotimp(m))
	fmt.Println("Luna 3:", time.Month(3), "-", anotimp(time.Month(3)))
	fmt.Println("Valoare greșită:", time.Month(13))
}

Rezultat

October 10 October
În română: octombrie - toamnă
Luna 3: March - primăvară
Valoare greșită: %!Month(13)

Exemplul 2: Parcurgerea lunilor unui an

Ziua 0 a lunii următoare este ultima zi a lunii curente, deci Day() dă numărul de zile.

package main

import (
	"fmt"
	"time"
)

func main() {
	for m := time.January; m <= time.December; m++ {
		zile := time.Date(2028, m+1, 0, 0, 0, 0, 0, time.UTC).Day()
		fmt.Printf("%-9s %d zile\n", m, zile)
	}
}

Rezultat

January   31 zile
February  29 zile
March     31 zile
April     30 zile
May       31 zile
June      30 zile
July      31 zile
August    31 zile
September 30 zile
October   31 zile
November  30 zile
December  31 zile

Greșeli frecvente

  • Indexezi un tablou de 12 nume cu t.Month(): luna 12 iese din tablou. Lunile încep de la 1, deci pune un element gol pe poziția 0 sau scade 1.

Comenzi înrudite

  • time.Time.Date: Citește data dintr-un moment: Date dă anul, luna și ziua deodată; Year, Month și Day le dau pe rând.
  • time.Weekday: Tipul pentru zilele săptămânii, de la time.Sunday (0) la time.Saturday (6); String() dă numele englezesc.
  • time.Time.Format: Transformă un moment în text după un model scris cu data de referință 2 ianuarie 2006, 15:04:05.