Parsing 相对日期解析

Parsing 相对日期解析,parsing,datetime,go,Parsing,Datetime,Go,如何在GO中解析相对日期时间 相对日期示例: 今天上午9:17 昨天晚上9:58 星期六晚上9:44 星期三上午11:01 因此,格式是时间天(过去)。我尝试了下一个例子: const longForm=“周一下午3:04” t、 =time.Parse(长格式,“星期六下午3:50”) fmt.Println(t) 时间被正确解析,但天/日期被忽略…在我的评论上展开: 在解析器看来,仅仅Monday没有进一步的日期引用是毫无意义的,因此它被丢弃。哪个星期一?解析器是严格的,而不是模糊的。

如何在GO中解析相对日期时间

相对日期示例:

今天上午9:17
昨天晚上9:58
星期六晚上9:44
星期三上午11:01
因此,格式是时间
天(过去)
。我尝试了下一个例子:

const longForm=“周一下午3:04”
t、 =time.Parse(长格式,“星期六下午3:50”)
fmt.Println(t)


时间被正确解析,但天/日期被忽略…

在我的评论上展开:


在解析器看来,仅仅
Monday
没有进一步的日期引用是毫无意义的,因此它被丢弃。哪个星期一?解析器是严格的,而不是模糊的。假设星期一指的是当前的一周,这种解析器无法做到这一点。您不需要为此编写自己的更复杂的解析器

因此,它必须遵循以下原则-一个函数将相对模糊的日期转换为实际日期,并替换原始表达式中的日期,另一个函数解析整个事件:

const dateFormat = "2006-01-02"
const longForm = "2006-01-02 at 3:04 PM"

func parseFuzzyDate(fuzzyTime string) (time.Time, error) {

    formattedTime, err := parseDayAndReplaceIt(fuzzyTime)
    if err != nil {
       return nil, err
    }

    return time.Parse(longForm, formattedTime)
}
第二个函数获取模糊时间,找到日期,解析并返回。我不打算实施它,只是在评论中写下应该做什么:

func parseDayAndReplaceIt(fuzzyTime string) (string, error) {
   // 1. Extract the day

   // 2. Parse weekday names to relative time

   // 3. if it's not a weekday name, parse things like "tomorrow" "yesterday"

   // 4. replace the day string in the original fuzzyTime with a formatted date that the parser can understand

   // 5. return the formatted date
}

我调整了前一段时间编写的内容,并将其整合到以下示例代码中:

func lastDateOf(targetDay time.Weekday, timeOfDay time.Time) time.Time {
    const oneDay = 24 * time.Hour
    var dayIndex time.Duration

    //dayIndex -= oneDay
    for {
        if time.Now().Add(dayIndex).Weekday() == targetDay {
            y, m, d := time.Now().Add(dayIndex).Date()
            return timeOfDay.AddDate(y, int(m)-1, d-1)
        }
        dayIndex -= oneDay
    }
}
它返回添加到
timeOfDay
中的前一个
targetDay
的日期(相对于现在),假设
timeOfDay
包含小时、分钟和秒,以及年、月和日的零时间值,它将为您提供合适的答案

它不是很灵活,但我相信它相当适合你的例子。虽然它并没有涉及诸如“明天”、“昨天”或“下周六”等相关术语

.

自定义解析器中的可运行版本:

func RelativeDateParse(s string) (time.Time, error) {
    for n := 0; n < 7; n++ {
        day := time.Now().AddDate(0, 0, -n)
        dayName := day.Format("Monday")
        switch n {
        case 0:
            dayName = "today"
        case 1:
            dayName = "yesterday"
        }
        s = strings.Replace(s, dayName + " at", day.Format("2006-01-02"), -1)
    }
    return time.Parse("2006-01-02 3:04 PM", s)
}
func RelativeDateParse(s字符串)(time.time,error){
对于n:=0;n<7;n++{
day:=time.Now().AddDate(0,0,-n)
dayName:=日格式(“星期一”)
开关n{
案例0:
dayName=“今天”
案例1:
dayName=“昨天”
}
s=字符串。替换(s,dayName+“at”,day.Format(“2006-01-02”),-1)
}
返回时间解析(“2006-01-02下午3:04”,秒)
}

Monday
没有进一步的日期引用在解析器看来是毫无意义的,因此它被丢弃。哪个星期一?你不必为此编写自己更复杂的解析器。@not_a_Golfer:过去的第一个星期一,我已经在问题中写道:
所以格式是“DAY(在过去)at TIME”。我尝试了下一个示例:
是的,但您能告诉解析器这一点吗?不!