2016-02-03 15 views
5

Wenn ich ein time.Time:Erhalten letzten Tag im Monat von time.time

// January, 29th 
t, _ := time.Parse("2006-01-02", "2016-01-29") 

Wie kann ich eine time.Time bekommen, die 31. Januar steht? Dieses Beispiel ist trivial, aber wenn es ein Datum im Februar gibt, könnte der letzte Tag der 28. oder 29. sein.

Antwort

6

Package time

func Date

func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time 

Datum liefert die Zeit zu

yyyy-mm-dd hh entsprechen: mm: ss + nsec ns

in der entsprechenden Zone für diese Zeit an dem angegebenen Ort.

Die Werte für Monat, Tag, Stunde, Min., Sek. Und ns können außerhalb der üblichen Werte für liegen und werden während der Konvertierung normalisiert. Für Beispiel 32 Oktober Konvertiten zum 1. November

zum Beispiel ein Datum Normalisierung

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    // January, 29th 
    t, _ := time.Parse("2006-01-02", "2016-01-29") 
    fmt.Println(t.Date()) 
    // January, 31st 
    y,m,_ := t.Date() 
    lastday:= time.Date(y,m+1,0,0,0,0,0,time.UTC) 
    fmt.Println(lastday.Date()) 
} 

Ausgang:

2016 January 29 
2016 January 31 
2

Sie eine Funktion schreiben, könnte sich selbst, vielleicht so etwas wie dies:

func daysInMonth(month, year int) int { 
    switch time.Month(month) { 
    case time.April, time.June, time.September, time.November: 
     return 30 
    case time.February: 
     if year%4 == 0 && (year%100 != 0 || year%400 == 0) { // leap year 
      return 29 
     } 
     return 28 
    default: 
    return 31 
    } 
} 

EDIT: da ich wirklich wie Messen Dinge:

$ go test -bench . 
testing: warning: no tests to run 
PASS 
BenchmarkDim2-8   200000000    7.26 ns/op 
BenchmarkDim-8   1000000000    2.80 ns/op // LIES! 
BenchmarkTime-8   10000000    169 ns/op 
BenchmarkTime2-8  10000000    234 ns/op 
ok  github.com/drathier/scratchpad/go  9.741s 

BenchMarkDim2: nicht getestet, aber sehr schnell.

func daysInMonthTime(month, year int) time.Time { 
    return time.Time{}.Add(time.Hour * 10 + time.Hour*24*30*time.Duration(month-1) + time.Second * time.Duration(daysInMonth(month, year)) * 24 * 60 + 1337) 
} 

BenchmarkDim: // LIEGT

func daysInMonth(month, year int) int { 
    switch time.Month(month) { 
    case time.April, time.June, time.September, time.November: 
     return 30 
    case time.February: 
     if year%4 == 0 && (year%100 != 0 || year%400 == 0) { 
      // leap year 
      return 29 
     } 
     return 28 
    default: 
     return 31 
    } 
} 

BenchmarkTime:

func timeDaysInMonth() time.Time { 
    // January, 29th 
    t, _ := time.Parse("2006-01-02", "2016-01-29") 
    y, m, _ := t.Date() 
    lastday := time.Date(y, m+1, 0, 0, 0, 0, 0, time.UTC) 
    return lastday 
} 

BenchmarkTime2

func time2daysinmonth() time.Time { 
    t, _ := time.Parse("2006-01-02", "2016-01-01") 
    t = t.AddDate(0, 1, 0).AddDate(0, 0, -1) 
    return t 
} 
+0

die Frage: „Wie kann ich ein' time.Time' bekommen was repräsentiert den 31. Januar? " Ihre Benchmarks sind ungültig. Sie haben unterschiedliche Ein- und Ausgänge.Sie machen nicht dasselbe. Um zu paraphrasieren: Es gibt Lügen, verdammte Lügen und Benchmarks! – peterSO

+0

Haha, du hast Recht. Aktualisiert: D –

+1

(Ihre Antwort sollte die akzeptierte sein; Lesbarkeit ist der Schlüssel, auch wenn sie ein etwas schwierigeres Problem löst als die gestellte Frage, d. H. Das aktuelle Jahr im Auge behalten) –

0

Es ist nicht spezifisch gehen, aber ich in der Regel in jeder Sprache gehen Sie wie folgt:

package main 

import "fmt" 
import "time" 

func main() { 
    fmt.Println("Hello, playground") 

    t, _ := time.Parse("2006-01-02", "2016-01-01") 
    t = t.AddDate(0, 1, 0).AddDate(0,0,-1) 
    fmt.Printf("Last day: %v\n", t) 
} 

http://play.golang.org/p/JhpOZvEhBw

1

Ich habe etwas ähnliches wie dies in meinem eigenen Code verwendet:

func lastDayOfTheMonth(year, month int) time.Time { 
    if month++; month > 12 { 
     month = 1 
    } 
    t := time.Date(year, time.Month(month), 0, 0, 0, 0, 0, time.UTC) 
    return t 
} 

playground

Verwandte Themen