在Go中解析具有负年份的日期?

How do I parse the date "3 Mar -1500" to represent 1500 BC?

https://play.golang.org/p/akqQPj4mLeo

Here is a first draft that illustrates the concept:

package main

import (
    "fmt"
    "strings"
    "time"
)

func parseCEDate(value string) (time.Time, error) {
    const layout = "_2 Jan 2006"
    date, err := time.Parse(layout, value)
    if err == nil {
        return date, err
    }
    perr, ok := err.(*time.ParseError)
    if !ok {
        return time.Time{}, err
    }
    if perr.LayoutElem != "2006" {
        return time.Time{}, err
    }
    if !strings.HasPrefix(perr.ValueElem, "-") {
        return time.Time{}, err
    }
    value = strings.Replace(value, perr.ValueElem, perr.ValueElem[1:], 1)
    date, derr := time.Parse(layout, value)
    if derr != nil {
        return time.Time{}, err
    }
    return date.AddDate(-2*date.Year(), 0, 0), derr
}

func main() {
    fmt.Println(parseCEDate("3 Mar -1500"))
    fmt.Println(parseCEDate("3 Mar 1500"))
}

Playground: https://play.golang.org/p/QtZ5BBSJmHJ

Output:

-1500-03-03 00:00:00 +0000 UTC <nil>
1500-03-03 00:00:00 +0000 UTC <nil>