Menu
CoddyTech

时间格式化

本课属于 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 的时间格式化既容易记忆,又灵活。记住参考日期后,你只需按自己想要的模式排列各个组成部分,就能创建任意格式。

challenge icon

挑战

简单

创建一个多格式的日期和时间显示系统,使用 Go 独特的参考日期布局系统来格式化 time.Time 对象。本挑战将测试你使用 Format 方法和不同布局模式,生成各种日期和时间表示形式的能力。

你将收到两个输入:

  • 一个包含日期信息的字符串,格式为 "year:month:day:hour:minute"(例如:"2023:12:25:14:30")
  • 一个包含格式请求的字符串,各请求以逗号分隔,格式为 "format1,format2,format3"(例如:"iso,american,european,time12,time24")

你的任务是:

  1. 通过按冒号拆分第一个输入,提取年份、月份、日期、小时和分钟的值
  2. 使用 strconv 包将这些字符串值转换为整数
  3. 使用解析后的值和 time.Date 创建一个 time.Time 对象(位置使用 time.UTC,秒和纳秒设为 0)
  4. 显示应用程序标题:"=== DATE/TIME FORMATTER ==="
  5. 显示源时间:"Source time: [complete_time_object]"
  6. 通过按逗号拆分第二个输入,获取格式请求
  7. 显示格式化标题:"Formatted outputs:"
  8. 对于每个格式请求,使用 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]"
  9. 计算并显示统计信息:
    • "=== FORMATTING SUMMARY ==="
    • "Total formats applied: [number_of_format_requests]"
    • "Date components: [year]-[month]-[day]"
    • "Time components: [hour]:[minute]"
  10. 显示参考信息:
    • "=== 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"
  11. 显示完成消息:"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: 在下方编写你的代码
	// 显示应用程序标题
	// 显示原始时间
	// 处理每个格式请求并显示格式化后的输出
	// 计算并显示统计信息
	// 显示参考信息
	// 显示完成消息
	
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Go 在线编译器