Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何得到最后一个季度_Go - Fatal编程技术网

Go 如何得到最后一个季度

Go 如何得到最后一个季度,go,Go,下面是我获取最后一个完整季度的代码: package main import ( "fmt" "time" ) func main() { layout := "2006-01-02T15:04:05.000Z" str := "2017-11-30T12:00:00.000Z" now, _ := time.Parse(layout, str) endDate := now.AddDate(0, 0, 0-now.Day()) st

下面是我获取最后一个完整季度的代码:

package main

import (
    "fmt"
    "time"
)

func main() {
    layout := "2006-01-02T15:04:05.000Z"
    str := "2017-11-30T12:00:00.000Z"
    now, _ := time.Parse(layout, str)

    endDate := now.AddDate(0, 0, 0-now.Day())
    startDate := endDate.AddDate(0, -3, 0) // startDate is wrong: 2017-07-31
    // the following statement is needed to fix startDate
    if endDate.Month()-startDate.Month() == 3 {
        startDate = startDate.AddDate(0, 0, 1) // now startDate is correct: 2017-08-01
    }

    fmt.Printf("Start date: %v\n", startDate.Format("2006-01-02"))
    fmt.Printf("End date: %v\n", endDate.Format("2006-01-02"))
}

有没有更好的方法来确定正确的开始日期

例如,如果我想得到最后一个学期,必须省略最后一个
startDate=startDate.AddDate(0,0,1)
语句:

endDate := now.AddDate(0, 0, 0-now.Day())
startDate := endDate.AddDate(0, -6, 0) // startDate is correct: 2017-05-01
package main

import (
    "fmt"
    "time"
)

func lastPeriod(t time.Time, period time.Month) (start, end time.Time) {
    y, m, _ := t.Date()
    loc := t.Location()
    start = time.Date(y, m-period, 1, 0, 0, 0, 0, loc)
    end = time.Date(y, m, 1, 0, 0, 0, -1, loc)
    return start, end
}

func main() {
    layout := "2006-01-02T15:04:05.000Z"
    str := "2017-11-30T12:00:00.000Z"
    now, err := time.Parse(layout, str)
    if err != nil {
        fmt.Println(err)
        return
    }
    const (
        quarter  = 3
        semester = 6
    )
    fmt.Println("Quarter:")
    start, end := lastPeriod(now, quarter)
    fmt.Printf("Base date:  %v\n", now.Format("2006-01-02"))
    fmt.Printf("Start date: %v\n", start.Format("2006-01-02"))
    fmt.Printf("End date:   %v\n", end.Format("2006-01-02"))
    fmt.Println("Semester:")
    start, end = lastPeriod(now, semester)
    fmt.Printf("Base date:  %v\n", now.Format("2006-01-02"))
    fmt.Printf("Start date: %v\n", start.Format("2006-01-02"))
    fmt.Printf("End date:   %v\n", end.Format("2006-01-02"))
}
为什么会有这种差异

Date返回对应于的时间

yyyy-mm-dd hh:mm:ss + nsec nanoseconds
在给定位置的适当区域中,该时间

月、日、小时、分钟、秒和nsec值可能超出其范围 通常的范围,并将在转换期间标准化。对于 例如,10月32日转换为11月1日


例如,使用标准化获取最后一个完整的期间(例如,季度或学期):

游乐场:

输出:

Quarter:
Base date:  2017-11-30
Start date: 2017-08-01
End date:   2017-10-31
Semester:
Base date:  2017-11-30
Start date: 2017-05-01
End date:   2017-10-31

我不认为需要
if
语句,因为
endDate
总是上个月的最后一天。而
startDate
-3个月+1天
结束日期
。你是对的。。。但是如果我想得到最后一个学期,那么最后一个“startDate.AddDate(0,0,1)”必须省略。。。我不明白为什么-我会在几秒钟内更新我的示例。您会得到日期溢出,所以更好的解决方案可能是首先获得
startDate
,然后设置
endDate
,如下所示:或。
package main

import (
    "fmt"
    "time"
)

func lastPeriod(t time.Time, period time.Month) (start, end time.Time) {
    y, m, _ := t.Date()
    loc := t.Location()
    start = time.Date(y, m-period, 1, 0, 0, 0, 0, loc)
    end = time.Date(y, m, 1, 0, 0, 0, -1, loc)
    return start, end
}

func main() {
    layout := "2006-01-02T15:04:05.000Z"
    str := "2017-11-30T12:00:00.000Z"
    now, err := time.Parse(layout, str)
    if err != nil {
        fmt.Println(err)
        return
    }
    const (
        quarter  = 3
        semester = 6
    )
    fmt.Println("Quarter:")
    start, end := lastPeriod(now, quarter)
    fmt.Printf("Base date:  %v\n", now.Format("2006-01-02"))
    fmt.Printf("Start date: %v\n", start.Format("2006-01-02"))
    fmt.Printf("End date:   %v\n", end.Format("2006-01-02"))
    fmt.Println("Semester:")
    start, end = lastPeriod(now, semester)
    fmt.Printf("Base date:  %v\n", now.Format("2006-01-02"))
    fmt.Printf("Start date: %v\n", start.Format("2006-01-02"))
    fmt.Printf("End date:   %v\n", end.Format("2006-01-02"))
}
Quarter:
Base date:  2017-11-30
Start date: 2017-08-01
End date:   2017-10-31
Semester:
Base date:  2017-11-30
Start date: 2017-05-01
End date:   2017-10-31