Go語言time包的練習及封裝

jopen 9年前發布 | 56K 次閱讀 Go語言 Google Go/Golang開發

把time包相關的函數用法過了下,基本包含大部份常見的用法了.
并封裝了下日期顯示格式定制及time.Time數組排序的功能.以便以后調用.

保留下測試所用例子:    

    package main   

    //author:xcl  
    //2014-1-14  

    import (  
        "fmt"  
        "time"  
        "github.com/xclpkg/utils"  
        "sort"  
    )  

    func main(){  

        t := time.Now();  
        //alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';  
        //select to_date('2014-06-09 18:04:06','yyyy-MM-dd HH24:mi:ss') as dt from dual;  
        fmt.Println("\n演示時間 => ",utils.GetTmShortStr(t,"y-m-d H:i:s a"))  

        //返回當前是一年中的第幾天  
        //select to_char(sysdate,'ddd'),sysdate from dual;  
        yd := t.YearDay();  
        fmt.Println("一年中的第幾天: ",yd)         

        //一年中的第幾周  
        year,week := t.ISOWeek()  
        fmt.Println("一年中的第幾周: ",year," | ",week)         

        //當前是周幾  
        //select to_char(sysdate,'day') from dual;  
        //select to_char(sysdate,'day','NLS_DATE_LANGUAGE = American') from dual;     
        fmt.Println("當前是周幾: ",t.Weekday().String())  

        //字符串轉成time.Time  
        //alter session set nls_date_format='yyyy-mm-dd hh:mi:ss';  
        //select to_date('14-06-09 6:04:06','yy-MM-dd hh:mi:ss') as dt from dual;      
        tt,er := time.Parse(utils.GoStdTime(),"2014-06-09 16:04:06")  
        if(er != nil){  
            fmt.Println("字符串轉時間: parse error!")  
        }else{  
            fmt.Println("字符串轉時間: ",tt.String())  
        }  


        fmt.Println("\n演示時間 => ",utils.GetTmStr(t,"y-m-d h:i:s"))  

        ta := t.AddDate(1,0,0)     
        fmt.Println("增加一年 => ",utils.GetTmStr(ta,"y-m-d"))  

        ta = t.AddDate(0,1,0)  
        fmt.Println("增加一月 => ",utils.GetTmStr(ta,"y-m-d"))  

        //select sysdate,sysdate + interval '1' day from dual;  
        ta = t.AddDate(0,0,1) //18  
        fmt.Println("增加一天 => ",utils.GetTmStr(ta,"y-m-d"))  

        durdm,_ := time.ParseDuration("432h")  
        ta = t.Add(durdm)  
        fmt.Println("增加18天(18*24=432h) => ",utils.GetTmStr(ta,"y-m-d"))  

        //select sysdate,sysdate - interval '7' hour from dual;  
        dur,_ := time.ParseDuration("-2h")  
        ta = t.Add(dur)  
        fmt.Println("減去二小時 => ",utils.GetTmStr(ta,"y-m-d h:i:s"))  

        //select sysdate,sysdate - interval '7' MINUTE from dual;  
        durmi,_ := time.ParseDuration("-7m")  
        ta = t.Add(durmi)  
        fmt.Println("減去7分鐘 => ",utils.GetTmStr(ta,"y-m-d h:i:s"))  

        //select sysdate,sysdate - interval '10' second from dual;  
        durs,_ := time.ParseDuration("-10s")  
        ta = t.Add(durs)  
        fmt.Println("減去10秒 => ",utils.GetTmStr(ta,"y-m-d h:i:s"))  

        ttr,er := time.Parse(utils.GoStdTime(),"2014-06-09 16:58:06")  
        if(er != nil){  
            fmt.Println("字符串轉時間: 轉換失敗!")  
        }else{  
            fmt.Println("字符串轉時間: ",ttr.String())  
        }  

        //alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';  
        //select trunc(to_date('2014-06-09 16:58:06','yyyy-mm-dd hh24:mi:ss'),'mi') as dt from dual;   
        // SQL => 2014-06-09 16:58:00  
        // Truncate =>  2014-06-09 16:50:00  
        durtr,_ := time.ParseDuration("10m")  
        ta = ttr.Truncate(durtr)  
        fmt.Println("Truncate => ",utils.GetTmStr(ta,"y-m-d H:i:s"))  

        //select round(to_date('2014-06-09 16:58:06','yyyy-mm-dd hh24:mi:ss'),'mi') as dt from dual;   
        // SQL => 2014-06-09 16:58:00  
        // Round =>  2014-06-09 17:00:00  
        ta = ttr.Round(durtr)  
        fmt.Println("Round => ",utils.GetTmStr(ta,"y-m-d H:i:s"))  

        //日期比較  
        tar1,_ := time.Parse(utils.GoStdTime(),"2014-06-09 19:38:36")  
        tar2,_ := time.Parse(utils.GoStdTime(),"2015-01-14 17:08:26")  
        if tar1.After(tar2) {  
            fmt.Println("tar1 > tar2")  
        }else if tar1.Before(tar2) {  
            fmt.Println("tar1 < tar2")  
        }else{  
            fmt.Println("tar1 = tar2")  
        }  
        tar3,_ := time.Parse(utils.GoStdTime(),"2000-07-19 15:58:16")  

        //日期列表中最晚日期  
        // select greatest('2014-06-09','2015-01-14','2000-07-19') from dual;      
        var arr utils.TimeSlice  
        arr = []time.Time{tar1,tar2,tar3}  
        temp := utils.Greatest(arr)  
        fmt.Println("日期列表中最晚日期 => ",utils.GetTmStr(temp,"y-m-d"))      

        //日期數組從早至晚排序  
        fmt.Println("\n日期數組從早至晚排序")  
        sort.Sort(arr)  
        for _,at := range arr {  
             fmt.Println("Sort => ",utils.GetTmStr(at,"y-m-d H:i:s"))  
        }  

    }  

  AddDate與ParseDuration有個區別需要注意:
             在AddDate中各位置是獨立的.既在對應位置的更改,不會影響其它位置的值,如日期add超過月底(30/31),月份不會自動增加,而日期則會變更為01.
             但ParseDuration則不同,是針對整個time.Time的變更.

       例子中將Oracle相關功能的SQL實現,也簡單的附注了下.日期時間處理其實蠻復雜的,

查查Oracle的Date和Timestamp相關知識就知道要考慮多少東西了.

time包能封裝的這么簡潔真不容易.

         我自己封裝的包放在此: github


MAIL: xcl_168@aliyun.com

BLOG:http://blog.csdn.net/xcl168

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!