ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

go时间日期与时区相关操作

2020-10-28 14:35:16  阅读:195  来源: 互联网

标签:loc return string time 日期 func Time go 时区


~~~

package main

import (
    "errors"
    "time"
    "github.com/jinzhu/now"
)

const (
    BINano  = "2006-01-02 15:04:05.000000000"
    BIMicro = "2006-01-02 15:04:05.000000"
    BIMil   = "2006-01-02 15:04:05.000"
    BISec   = "2006-01-02 15:04:05"
    BICST   = "2006-01-02 15:04:05 +0800 CST"
    BIUTC   = "2006-01-02 15:04:05 +0000 UTC"
    BIDate  = "2006-01-02"
    BITime  = "15:04:05"
)

/** 时间-时间戳-时间字符串互相转换

- time: auto timezone associated | 时间必关联时区属性

- str<=>time时,loc或者format不改变时间展示值,仅改变时区或偏移 | timezone associated

- timestamp: means seconds/nanoseconds of currenttime since January 1, 1970 UTC.

*/

// 获取time默认值, 造一个错误
func getTimeDefault(loc *time.Location) time.Time {
    loc = getLocationDefault(loc)
    t, _ := time.ParseInLocation("2006-01-02 15:04:05", "", loc)
    return t
}

func getLocationDefault(loc *time.Location) *time.Location {
    if loc == nil {
        loc, _ = time.LoadLocation("Local")
    }
    return loc
}

/** timestamp <--> time

- 使用当前配置的时区包

*/
// Timestamp2Time 时间戳转时间
func Timestamp2Time(stamp int64, nsec int64) time.Time {

    return time.Unix(stamp, nsec)
}

// Timestamp2TimeNano 时间戳转时间,纳秒
func Timestamp2TimeNano(stamp int64) time.Time {

    return Timestamp2Time(0, stamp)
}

func Timestamp2TimeMil(stamp int64) time.Time {

    return Timestamp2Time(0, stamp*1e6)
}

func Timestamp2TimeSec(stamp int64) time.Time {

    return Timestamp2Time(stamp, 0)
}

// Time2Timestamp 时间转时间戳
func Time2Timestamp(t time.Time, nsec int64) int64 {
    if nsec >= 0 {
        return t.Unix()
    }
    return t.UnixNano()
}

func Time2TimestampSec(t time.Time) int64 {
    return Time2Timestamp(t, 0)
}

func Time2TimestampMil(t time.Time) int64 {
    return Time2TimestampNano(t) / 1e6
}

func Time2TimestampNano(t time.Time) int64 {
    return Time2Timestamp(t, -1)
}

/** Timestr <--> time

- time->timestr 直接使用time.Format

*/

// Timestr2TimeBasic 字符串转时间
func Timestr2TimeBasic(value string, resultFormat string, resultLoc *time.Location) (time.Time, error) {
    /**
    - params
        value:             转换内容字符串
        resultFormat:    结果时间格式
        resultLoc:        结果时区
    */
    resultLoc = getLocationDefault(resultLoc)
    useFormat := []string{ // 可能的转换格式
        BINano, BIMicro, BIMil, BISec, BICST, BIUTC, BIDate, BITime,
        time.RFC3339,
        time.RFC3339Nano,
    }
    var t time.Time
    for _, usef := range useFormat {
        tt, error := time.ParseInLocation(usef, value, resultLoc)
        t = tt
        if error != nil {
            continue
        }
        break
    }
    if t == getTimeDefault(resultLoc) {
        return t, errors.New("时间字符串格式错误")
    }

    if resultFormat == "" {
        resultFormat = "2006-01-02 15:04:05"
    }
    st := t.Format(resultFormat)
    fixedt, _ := time.ParseInLocation(resultFormat, st, resultLoc)

    return fixedt, nil
}

func Timestr2Time(str string) (time.Time, error) {
    return Timestr2TimeBasic(str, "", nil)
}

/** Timestr <--> timestamp

- 先转换成时间,再转换时间戳

*/
// Timestr2TimestampBasic 时间字符串转时间戳, 单位秒
func Timestr2TimestampBasic(str string, format string, loc *time.Location) (float64, error) {
    t, err := Timestr2TimeBasic(str, format, loc)
    if err != nil {
        return -1., err
    }
    return (float64(t.UnixNano()) * 1.0) / 1e9, nil
}

// Timestr2TimestampWithFormat
func Timestr2TimestampWithFormat(str string, format string) (float64, error) {
    return Timestr2TimestampBasic(str, format, nil)
}

// Timestr2Timestamp 时间字符串转时间戳
func Timestr2Timestamp(str string) (float64, error) {
    return Timestr2TimestampBasic(str, "", nil)
}

/** Time <--> time

 */

// Time2TimeBasic 特定格式化的时
func Time2TimeBasic(t time.Time, format string, loc *time.Location) (time.Time, error) {
    loc = getLocationDefault(loc)
    if format == "" {
        return t, nil
    }
    strT := t.Format(format)

    resT, err := Timestr2TimeBasic(strT, format, loc)
    if err != nil {
        return t, err
    }
    return resT, nil

    // tmp := t.In(loc)
    // resT, errr := time.ParseInLocation(tmp.Format(format), format, loc)
    // if err != nil {
    //     return t, err
    // }
    // return resT, nil
}

// Time2Time 特定格式化的时间
func Time2Time(t time.Time, format string) (time.Time, error) {

    return Time2TimeBasic(t, format, nil)
}

/** 时间计算

 */

// TimePlus 时间加减
func TimePlus(t time.Time, value string) time.Time {
    // next 增加"[x]d"(天数)格式支持
    m, _ := time.ParseDuration(value)
    tCal := t.Add(m)
    return tCal
}

func TimeSubtraction(t1 time.Time, t2 time.Time) time.Duration {

    return t1.Sub(t2)
}

func TimeSubtractionDay(t1 time.Time, t2 time.Time) int64 {

    timeD := TimeSubtraction(t1, t2)
    return (int64)(timeD/time.Second) / 86400
}

func TimeStrSubtraction(str1 string, str2 string) time.Duration {

    t1, _ := Timestr2Time(str1)
    t2, _ := Timestr2Time(str2)

    return TimeSubtraction(t1, t2)
}

func TimeStrSubtractionDay(str1 string, str2 string) int64 {

    t1, _ := Timestr2Time(str1)
    t2, _ := Timestr2Time(str2)

    return TimeSubtractionDay(t1, t2)
}

// AddDate 增加年份 月份
func AddDate(t time.Time, years int, months int) time.Time {
    year, month, day := t.Date()
    hour, min, sec := t.Clock()

    // firstDayOfMonthAfterAddDate: years 年,months 月后的 那个月份的1号
    firstDayOfMonthAfterAddDate := time.Date(year+years, month+time.Month(months), 1,
        hour, min, sec, t.Nanosecond(), t.Location())
    // firstDayOfMonthAfterAddDate 月份的最后一天
    lastDay := now.New(firstDayOfMonthAfterAddDate).EndOfMonth().Day()

    // 如果 t 的天 > lastDay,则设置为lastDay
    // 如:t 为 2020-03-31 12:00:00 +0800,增加1个月,为4月31号
    // 但是4月没有31号,则设置为4月最后一天lastDay(30号)
    if day > lastDay {
        day = lastDay
    }

    return time.Date(year+years, month+time.Month(months), day,
        hour, min, sec, t.Nanosecond(), t.Location())
}

~~~

标签:loc,return,string,time,日期,func,Time,go,时区
来源: https://www.cnblogs.com/paulwhw/p/13890881.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有