1. 程式人生 > >Go語言time包的練習及封裝

Go語言time包的練習及封裝

把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: [email protected]

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

相關推薦

Go語言time練習封裝

把time包相關的函式用法過了下,基本包含大部份常見的用法了. 並封裝了下日期顯示格式定製及time.Time陣列排序的功能.以便以後呼叫.保留下測試所用例子:      package main //author:xcl //2014-1-14 import (

go語言time的學習(Time,Location,Duration,Timer,Ticker)

after 當前時間 ++ 語言 pre before hour 字符 asi package main; import ( "time" "fmt" ) func main() { //time.Time代表一個納秒精度的時間點 var

go語言sync的學習(Mutex、WaitGroup、Cond)

pri lee 拷貝 light 等待 runt broadcast 計算 混亂 package main; import ( "fmt" "sync" "runtime" "time" ) //加鎖,註意鎖要以指針的形式傳進來,不然只是拷

go語言log的學習(log,Logger)

等價 信息 printf setflags 內容 獲取 orm test reat package main; import ( "log" "os" "time" "fmt" ) func main() { //創建輸出日誌文件

go語言netudp socket的使用

tcp clas 請求方式 return fmt 讀取數據 print 簡單 cep udp與tcp的不同在於客戶端請求方式不同,udp缺少Accept函數。 一個簡單的udp客戶端: package main; import ( "net" "log

Go語言標準之json編碼

println home turn tle gop lin 3.2 title blog 標準的就簡單通用。 package main import ( "encoding/json" "fmt" "log" ) func main()

Go語言Context(設計分析)

sin 循環 elf 處理請求 val pri inter text ont context簡單概述:Go服務器的每個請求都有自己的goroutine,而有的請求為了提高性能,會經常啟動額外的goroutine處理請求,當該請求被取消或超時,該請求上的所有goroutine

Go語言之map練習

mapmap理論基礎知識 類似其他語言中的哈希表或者字典,以key-value形式存儲數據 key必須是支持== 或者 != 比較運算的類型,不可以是函數,map或者slice map查找比線性搜索快很多,但比使用索引訪問數據的類型慢100倍 map使用make()創建,支持:=這種簡寫方式 make(

go語言 鏈表練習

div 長度 指定 指定節點 Go語言 ast class 位置 return package main import "fmt" //定義節點 type Node struct { Data int Next *Node } /* * 返回第一個節點 * h

Go語言開發(六)、Go語言

技術 iad 調用 導致 nil \n 整體 不支持 變化 Go語言開發(六)、Go語言閉包 一、函數式編程 1、函數式編程簡介 函數式編程是一種編程模型,將計算機運算看作是數學中函數的計算,並且避免了狀態以及變量的概念。在面向對象思想產生前,函數式編程已經有數十年的歷史。

Go語言管理

如果 shel private 程序 源碼 imp erp 安裝 所有 1 概述 Go 語言的源碼復用建立在包(package)基礎之上。包通過 package, import, GOPATH 操作完成。 2 main包 Go 語言的入口 main() 函數所在的包(pac

Go 語言

程式碼示例(程式碼來自網上) package main import "fmt" //構造閉包 func intSeq() func() int { i := 0 return func() int { i++ ret

GO語言規範-

GO語言規範-包 原始檔的組織結構 package 語句 import宣告 Go程式是通過把包連結到一起構成的。包是由一個個一起定義了屬於該包的常量、型別、變數、函式(它們可以被同一個包內的所有檔案訪問,也可以通過匯出

GO語言之旅練習:Reader

實現一個 Reader 型別,它產生一個 ASCII 字元 'A' 的無限流。 程式碼如下: package main import "golang.org/x/tour/reader" type MyReader struct{} // TODO: Add a R

GO語言之旅練習:rot13Reader

有種常見的模式是一個 io.Reader 包裝另一個 io.Reader,然後通過某種方式修改其資料流。 例如,gzip.NewReader 函式接受一個 io.Reader(已壓縮的資料流)並返回一個同樣實現了 io.Reader 的 *gzip.Reader(解壓後的資

golang 新手練習 go語言 10分鐘練習

下面是golang的常見的入門程式碼 每天華10分鐘練習一邊 加強記憶   對於有c c++ 基礎的人 入門快 而且很快也可以做專案,但是忘記的也快,1個月不敲 竟然 處處是錯誤,也怪golang 語法有點奇葩,但是確實比C和C++ 好多了,我用的ide是  LITEIDE

Go語言fmtPrintf方法詳解

Go語言的標準輸出流在列印到螢幕時有些引數跟別的語言(比如C#和Java)不同,下面是我整理的一些常用的格式化輸入操作。 General %v 以預設的方式列印變數的值 %T 列印變數的型別 Integer %+d 帶符號的整型, fmt.Printf("

Go語言官方

Go語言官方包結構 版本:1.11.4,共有701個資料夾,5663個檔案,3939個go檔案。 1053個測試檔案(_test.go),測試檔案中包含138個示例檔案(類似example_test.go)。 sszxr:~ sszxr$ cd /usr/local/Cellar/g

go語言container中的那些容器

go語言container包中的那些容器 主要內容 List和Element。前者實現了一個雙向連結串列(以下簡稱連結串列),而後者則代表了連結串列中元素的結構。 List和Element都是結構體型別。結構體型別有一個特點,那就是它們的零值都會是擁有其特定結構,但沒有任何定製化

Go語言---strings(字串操作)

strings標準庫包主要涉及字串的基本操作。常見字串的操作有:字串求長度求子串是否存在某個字元或者子串子串出現的次數(字串匹配)字串分割(切分)成[]string字串是否存在某個字首或字尾字元或者子串在字串中首次出現的位置或最後一次出現的位置通過某個字串將[]string進