时间格式化
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 60 课,共 68 课。
有了 time.Time 对象后,你通常需要将它转换成易读的字符串格式。Go 使用独特的时间格式化方式,与其他编程语言不同。
Go 不使用 %Y-%m-%d 这样的格式代码,而是使用一个参考日期作为模板。这个参考日期是 Mon Jan 2 15:04:05 MST 2006,表示的确切时间是:2006 年 1 月 2 日下午 3:04:05,山地标准时间。
now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // 输出:2023-10-26关键在于,按照你想要的模式排列参考日期的各个部分。对于 YYYY-MM-DD 格式,你要使用 "2006-01-02",因为参考日期在这种模式下就是这样显示的。对于 Jan 2, 2006 这样的其他格式,你要使用 "Jan 2, 2006"。
这种基于布局的方法让 Go 的时间格式化既容易记忆,又灵活。记住参考日期后,你只需按自己想要的模式排列各个组成部分,就能创建任意格式。
挑战
简单创建一个多格式的日期和时间显示系统,使用 Go 独特的参考日期布局系统来格式化 time.Time 对象。本挑战将测试你使用 Format 方法和不同布局模式,生成各种日期和时间表示形式的能力。
你将收到两个输入:
- 一个包含日期信息的字符串,格式为
"year:month:day:hour:minute"(例如:"2023:12:25:14:30") - 一个包含格式请求的字符串,各请求以逗号分隔,格式为
"format1,format2,format3"(例如:"iso,american,european,time12,time24")
你的任务是:
- 通过按冒号拆分第一个输入,提取年份、月份、日期、小时和分钟的值
- 使用
strconv包将这些字符串值转换为整数 - 使用解析后的值和
time.Date创建一个time.Time对象(位置使用time.UTC,秒和纳秒设为 0) - 显示应用程序标题:
"=== DATE/TIME FORMATTER ===" - 显示源时间:
"Source time: [complete_time_object]" - 通过按逗号拆分第二个输入,获取格式请求
- 显示格式化标题:
"Formatted outputs:" - 对于每个格式请求,使用
Format方法和相应的布局字符串:- 对于
"iso":使用布局"2006-01-02",并显示"ISO format: [formatted_result]" - 对于
"american":使用布局"01/02/2006",并显示"American format: [formatted_result]" - 对于
"european":使用布局"02/01/2006",并显示"European format: [formatted_result]" - 对于
"long":使用布局"January 2, 2006",并显示"Long format: [formatted_result]" - 对于
"time12":使用布局"3:04 PM",并显示"12-hour time: [formatted_result]" - 对于
"time24":使用布局"15:04",并显示"24-hour time: [formatted_result]" - 对于
"full":使用布局"Monday, January 2, 2006 at 3:04 PM",并显示"Full format: [formatted_result]" - 对于
"compact":使用布局"20060102",并显示"Compact format: [formatted_result]"
- 对于
- 计算并显示统计信息:
"=== FORMATTING SUMMARY ===""Total formats applied: [number_of_format_requests]""Date components: [year]-[month]-[day]""Time components: [hour]:[minute]"
- 显示参考信息:
"=== REFERENCE DATE INFO ===""Go uses reference date: Mon Jan 2 15:04:05 MST 2006""This represents: January 2nd, 2006 at 3:04:05 PM""Layout patterns arrange these components as needed"
- 显示完成消息:
"Date formatting completed using Go's layout system"
使用 time 包执行时间操作,使用 strings 包拆分输入字符串,使用 strconv 包将字符串转换为整数,并使用 fmt 包生成格式化输出。请记住,Go 的时间格式化会使用参考日期 Mon Jan 2 15:04:05 MST 2006 作为模板,你可以按需要排列这些组成部分。本挑战通过让你将多种不同的格式模式应用于同一个时间对象,展示 Go 独特的基于布局的格式化系统的工作方式。
亲手试试
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// 读取输入
var dateInput string
var formatInput string
fmt.Scanln(&dateInput)
fmt.Scanln(&formatInput)
// 按冒号分割并解析日期的各个部分
dateComponents := strings.Split(dateInput, ":")
// 将字符串的各个部分转换为整数
year, _ := strconv.Atoi(dateComponents[0])
month, _ := strconv.Atoi(dateComponents[1])
day, _ := strconv.Atoi(dateComponents[2])
hour, _ := strconv.Atoi(dateComponents[3])
minute, _ := strconv.Atoi(dateComponents[4])
// 创建 time.Time 对象
sourceTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
// 解析格式请求
formatRequests := strings.Split(formatInput, ",")
// TODO: 在下方编写你的代码
// 显示应用程序标题
// 显示原始时间
// 处理每个格式请求并显示格式化后的输出
// 计算并显示统计信息
// 显示参考信息
// 显示完成消息
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Go 在线编译器