Go语言如何为已有timestamp设置时区且不改变时间显示值
你需要的效果是保留年/月/日/时/分/秒的数值不变,仅替换时间关联的时区属性,不要使用In()方法,该方法的作用是对同一个UTC时间点做时区转换,会修改显示的时间数值,不符合你的需求。
实现思路
- 从原始无时区的时间数据中提取出年、月、日、时、分、秒、纳秒的固定数值
- 使用
time.Date()构造方法,将上述数值和你查询到的目标时区作为参数传入,直接构造对应时区的时间对象
代码示例
package main import ( "fmt" "time" ) func main() { // 示例:原始无时区时间的数值为2009-11-10 23:00:00 rawYear, rawMonth, rawDay := 2009, time.November, 10 rawHour, rawMin, rawSec := 23, 0, 0 rawNano := 0 // 加载目标时区:纽约 loc, err := time.LoadLocation("America/New_York") if err != nil { panic(err) } // 用原始数值+目标时区构造时间对象 targetTime := time.Date(rawYear, rawMonth, rawDay, rawHour, rawMin, rawSec, rawNano, loc) fmt.Println(targetTime.Format(time.RFC3339)) }
运行输出
2009-11-10T23:00:00-05:00
扩展场景
如果你已经有time.Time类型的原始时间变量,可以直接提取它的字段构造新时间:
// 假设myTime为存储了原始时间数值的time.Time变量 targetTime := time.Date( myTime.Year(), myTime.Month(), myTime.Day(), myTime.Hour(), myTime.Minute(), myTime.Second(), myTime.Nanosecond(), loc, )
如果原始数据是无时区的时间字符串,可先解析得到裸时间再做处理:
rawTimeStr := "2009-11-10 23:00:00" // 用对应格式解析无时区字符串 rawTime, err := time.Parse("2006-01-02 15:04:05", rawTimeStr) if err != nil { panic(err) } // 后续提取rawTime的字段构造目标时区时间即可
内容的提问来源于stack exchange,提问作者jbrown
相关产品推荐
相关产品推荐

