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

时间: 2024-11-08 21:42:55

Go语言time包的练习及封装的相关文章

安装R语言的包的方法

安装R语言的包的方法: 1. 在线安装 在R的控制台,输入类似install.packages("TSA")  # 安装 TSA install.packages("TSA", contriburl="url",  dependencies = TRUE) # 安装TSA 2. 手动安装(离线安装) 在Windows下: 下载对应的package.zip文件 打开R的菜单条->Packages->"Install packa

Go语言之包管理

什么是 Go 语言中的包 我们在使用其他语言,比如 Java ,是有包的概念的.它是 Java 语言中组织我们的 Java 文件的一个概念,比如java.lang这个包,它里面有很多我们常用的类,比如 String.在 Go 语言中,包也是类似的概念.它是把我们的 Go 文件组织起来,可以方便进行归类.复用等, 比如 Go 内置的 net 包. net ├── http ├── internal ├── mail ├── rpc ├── smtp ├── testdata ├── textpro

R语言的包管理功能

现代的开发语言都已经不再是单一的编程语言和编译环境,而是一个网络化的分布式系统.通过包(packages)管理程序进行软件模块的安装.卸载.更新等操作. 包管理的思路从Linux操作系统而来,通过Debian的apt-get可以从全球数万个网站快速获取软件的最新版本.在Mac OS X上也可以通过MacPort或Brew进行软件包的管理.Java语言自己不带包管理程序,但可通过maven进行包的自动下载和编译.链接.nodejs是通过npm进行包管理.python通过pip进行包管理.这些都是在

R语言diagram包画订单状态流图

代码如下: library("diagram") #a <- read.table(file="clipboard",header=TRUE) write.table(a,file="a.txt",sep=";") aa <- a c <- matrix(nrow=ncol(aa),ncol=ncol(aa),0) i <- 1 while(i<=ncol(aa)){ j <- 1 whil

Go语言的包管理

1 概述 Go 语言的源码复用建立在包(package)基础之上.包通过 package, import, GOPATH 操作完成. 2 main包 Go 语言的入口 main() 函数所在的包(package)叫 main,main 包想要引用别的代码,需要import导入! 3 包定义,package Go 语言的包与文件夹一一对应,同一个目录下的所有.go文件的第一行添加 包定义,以标记该文件归属的包,演示语法: package 包名 包需要满足: 一个目录下的同级文件归属一个包. 包名可

Java语言Lang包下常用的工具类介绍_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 无论你在开发哪中 Java 应用程序,都免不了要写很多工具类/工具函数.你可知道,有很多现成的工具类可用,并且代码质量都很不错,不用你写,不用你调试,只要你发现. 在 Apache Jakarta Common 中, Lang 这个 Java 工具包是所有 Apache Jakarta Common 项目中被使用最广泛的,几乎你所知道的名气比较大的软件里面都有用到它,包括 Tomcat, Weblogic, Webs

对Java语言中包、修饰符、封装的一些总结

一.包(packsge)   1.包的概念 物理上是文件夹 逻辑上是有逻辑关系的集合   2.包的作用 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用: 包可以避免名字冲突.同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别. 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类.   3.包(package)的命名规范 在包名中,可以使用.号来区分包的级别:包名一般情况下是小写 第一级 指该项目的类型,

R语言TTR包的安装

R语言是一门统计语言,主要用于数学建模.统计计算.数据处理.可视化 等几个方向,R语言天生就不同于其他的编程语言.R语言封装了各种基础学科的计算函数,我们在R语言编程的过程中只需要调用这些计算函数,就可以构建出面向不同领域.不同业务的.复杂的数学模型. 一.作用 1.TTR包的目的是在R当中构造技术分析和其它技术交易规则的函数.TTR可在CRAN中找到,目前的版本号是0.22(更新2013-3-18). TTR目前的功能是提供了一些常见的技术分析指标的函数,可以分为下面几类: 移动平均 趋势检测

尝试自己的Perl语言的包 TCP协议的再包装起到类似python语言装饰器的效果

#!/usr/bin/perl # Filename: BuildSocketTCP.pm # #   Copyright 2012 Axxeo GmbH #   Licensed under the Apache License, Version 2.0 (the "License"); #   you may not use this file except in compliance with the License. #   You may obtain a copy of t