golang. - time 时间

回顾

Go语言中的包. package import

  • main 、main() 未来一个项目中只需要一个程序的入口

  • init() 函数,在main函数执行之前执行,可以有多个,执行顺序(注册、初始化、一次性的计算... 检查系统环境..)

strings:字符串的很多常用方法

  • 截取字符串

  • 查找字符串

  • 替换字符串

  • 以xx结尾或者开头

  • 统计数量

  • .....

strconv

bool - 字符串 ,“true” = 转换 true

数字 - 字符串, “3.99” / 转换为数字才可以进行计算

package main
​
import (
   "fmt"
   "strconv"
)
// 项目:前端(网页、小程序、app)  后端代码-接收前端的请求
/*
func http(request) response{
   string:= request.getUrlParm
   // 数据库
   // 计算
   // 字符串的转换
}
 */
// string convert  = strconv
func main() {
   // bool
   s1 := "true"
   // 转化 - 字符串转bool(解析:parse)
   // func ParseBool(str string) (bool, error)
   b1, err := strconv.ParseBool(s1)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Printf("%T,%t\n", b1, b1) // bool,true
   // bool转字符串(格式化 format)
   s2 := strconv.FormatBool(b1)
   fmt.Printf("%T,%s\n", s2, s2) // string,true
​
   // 整数->字符串  Format   字符串->整数
   s3 := "100000"
   // 整数: 数字、进制、大小
   // 参数:1、str   2、 进制(10)  3、大小
   i1, _ := strconv.ParseInt(s3, 10, 64)
   fmt.Printf("%T,%d\n", i1, i1) // int64,100
​
   s4 := strconv.FormatInt(i1, 10)
   fmt.Printf("%T,%s\n", s4, s4) // string,100000
​
   // 10进制转换字符串,简便方法  atoi  itoa
   atoi, _ := strconv.Atoi("-20")
   fmt.Printf("%T,%d\n", atoi, atoi) // int,-20
   itoa := strconv.Itoa(30)
   fmt.Printf("%T,%s\n", itoa, itoa) // string,30
​
}

time 时间

一切的代码,都是为了解决现实生活中可能出现的业务,时间是很重要的。

time包

  • 获取当前时间

  • 格式化时间

package main
​
import (
   "fmt"
   "time"
)
​
// time
func main() {
​
}
​
// 获取当前时间 now
func time1() {
   // 返回值为Time结构体 : 常量:日月年时分秒 周日-周六 方法:获取常量,计算。
   now := time.Now()
​
   year := now.Year()
   month := now.Month()
   day := now.Day()
   hour := now.Hour()
   minute := now.Minute()
   second := now.Second()
   // 2023-2-23 20:40:31
   // Printf : 整数补位--02如果不足两位,左侧用0补齐输出
   fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
​
}
​
func time2() {
   //time1()
   // 打印时间
   now := time.Now()
   // 时间格式化 2023-02-23 20:43:49
   // 格式化模板: yyyy-MM-dd HH:mm:ss
   // Go语言诞生的时间作为格式化模板:2006年1月2号下午3点4分
   // Go语言格式化时间的代码:2006-01-02 15:04:05  (记忆方式:2006 12 345)
   // 固定的:"2006-01-02 15:04:05"
   fmt.Println(now.Format("2006-01-02 15:04:05"))    // 24小时制
   fmt.Println(now.Format("2006-01-02 03:04:05 PM")) // 12小时制
   fmt.Println(now.Format("2006/01/02 15:04"))       // 2023/02/23 20:52
   fmt.Println(now.Format("15:04 2006/01/02"))       // 20:52 2023/02/23
   fmt.Println(now.Format("2006/01/02"))             // 2023/02/23
}
​
// 将字符串格式化为Time对象 (获取到网页传递的时间字符串,需要转化为Time才能在代码中使用)
func time3() {
   // 其他地方的时区格式:https://www.zeitverschiebung.net/cn/all-time-zones.html
   // 获取时间的时区 //  "Asia/Shanghai" 必须要大写 手动构建 ,如果不对,会报未知的时间错误
   loc, err := time.LoadLocation("Asia/Shanghai")
   if err != nil {
      fmt.Println(err)
      return
   }
   // 将字符串解析为时间 Time
   timeStr := "2023-02-23 20:53:08"
   // layout 格式 时间字符串  时区位置 , 需要和前端传递的格式进行匹配
   // func ParseInLocation(layout, value string, loc *Location)
   timeObj, _ := time.ParseInLocation("2006-01-02 15:04:05", timeStr, loc)
   fmt.Println(timeObj)
}
​
// 时间戳:更多时候和随机数结合
func time4()  {
   // 格林威治时间自1970年1月1日(00:00:00 GMT)至当前时间的总秒数
   // 时间戳 Unix : 1970.1.1 00:00:00 - 当下的一个毫秒数,Unix 时间戳,不会重复的。
   now := time.Now()
   timestamp1 := now.Unix()     // 时间戳
   timestamp2 := now.UnixNano() // 纳秒的时间数
​
   fmt.Println(timestamp1)
   fmt.Println(timestamp2)
   //
   // 通过 Unix 转换time对象
   timeObj := time.Unix(timestamp1, 0) // 返回time对象
   year := timeObj.Year()
   month := timeObj.Month()
   day := timeObj.Day()
   hour := timeObj.Hour()
   minute := timeObj.Minute()
   second := timeObj.Second()
   // 2023-2-23 20:40:31
   // Printf : 整数补位--02如果不足两位,左侧用0补齐输出
   fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}

随机数

package main
​
import (
  "fmt"
  "math/rand"
  "time"
)
​
// random随机数- math/rand
func main() {
  // 获取一个随机数
  num1 := rand.Int()
  fmt.Println("num1:", num1) // 5577006791947779410
  // 随机需要一个随机数的种子,如果种子一样,那么结果一致
  // n范围(0-n)
  num2 := rand.Intn(100)
  fmt.Println("num2:", num2) // 7
​
  // 需要一个随时都在发生变化的量 时间戳
  timestamp := time.Now().Unix()
  // 设置随机数种子, 使用时间戳
  // 种子只需要设置一次即可。
  rand.Seed(timestamp) // 每次执行都不同
  for i := 0; i < 5; i++ {
    // Intn [0,n)
    // 20-29
    num1 := rand.Intn(200) // 抽奖程序
    // 必中的逻辑
    num2 := rand.Intn(5) // 抽奖程序
    if i == num2 {
      fmt.Println(10)
      continue
    }
    fmt.Println(num1)
  }
​
}

定时器-时间操作

时间间隔常量 Duration

time.Duration是time包定义的一个类型,它代表两个时间点之间经过的时间

以纳秒为单位,可表示的最长时间段大约290年。

time包中定义的时间间隔类型的常量如下:

const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
) 

time.Duration表示1纳秒,time.Second表示1秒。

定时器

// 定时器: 每隔xxx s执行一次, 其余的关于定时器,放到chan讲
ticker := time.Tick(time.Second) // 每一秒都会触发。
for i := range ticker {
    fmt.Println(i)
}

时间判断

package main
​
import (
   "fmt"
   "time"
)
​
func main() {
   // 加  减    比较(在xxx之前  在xxx之后  相等)
   now := time.Now()
   later := now.Add(time.Hour)
   fmt.Println(later)
​
   // 两个时间的差值
   subTime := later.Sub(now)
   fmt.Println(subTime) // 1h0m0s
​
   // 比较时间, init() 校验时间 当地时间和网络时间是否一致
   fmt.Println(now.Equal(later))  // fasle
   fmt.Println(now.Before(later)) // true
   fmt.Println(now.After(later))  // fasle
}
​
// 定时器 - 本质是一个通道chan
func d1() {
   // 定时器: 每隔xxx s执行一次, 其余的关于定时器,放到chan讲
   ticker := time.Tick(time.Second) // 每一秒都会触发。
   for i := range ticker {
      fmt.Println(i)
   }
}

小案例:

package main
​
import (
  "syscall"
  "time"
  "unsafe"
)
​
func main() {
  ticker := time.Tick(time.Second) // 每一秒都会触发。
  for i := range ticker {
    msgBox(i.Format("2006-01-02 15:04:05"))
  }
}
func msgBox(timeStr string) {
  user32 := syscall.NewLazyDLL("user32.dll")
  messageBox := user32.NewProc("MessageBoxW")
  hwnd := 0 // 0表示将弹窗放在桌面的中心位置
  title := "Hello"
  text := timeStr
  flags := 0x00000000 | 0x00000040 // 0x00000000表示弹出消息框并且默认按钮为OK,0x00000040表示消息框的图标为信息图标
  messageBox.Call(uintptr(hwnd), uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))), uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(title))), uintptr(flags))
}

获取文件信息 file

计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件二进制文件

file类是在os:操作系统包中的,封装了底层的文件描述符和相关信息,同时封装了Read:读和Write:写的实现。

  • 获取文件信息

  • 创建目录,创建文件

  • IO 读、写

  • 文件复制

  • 断点续传

  • bufio

FileInfo 接口, os.stat() // 获取文件信息

package main
​
import (
  "fmt"
  "os"
)
​
// file
// fileInfo
/*
type FileInfo interface {
  Name() string       // base name of the file
  Size() int64        // length in bytes for regular files; system-dependent for others
  Mode() FileMode     // file mode bits : 权限
  ModTime() time.Time // modification time
  IsDir() bool        // abbreviation for Mode().IsDir()
​
  // 获取更加详细的文件信息, *syscall.Stat_t  反射来获取
  Sys() any           // underlying data source (can return nil)
*/
func main() {
  // 获取某个文件的状态
  fileinfo, err := os.Stat("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\demo01.go")
  if err != nil {
    return
  }
  fmt.Println(fileinfo.Name())    // demo01.go
  fmt.Println(fileinfo.IsDir())   // false
  fmt.Println(fileinfo.ModTime()) // 2023-02-23 20:25:43.1772351 +0800 CST
  fmt.Println(fileinfo.Size())    // 1186 字节数
  fmt.Println(fileinfo.Mode())    // -rw-rw-rw-
}

科普:权限

r:可读 w:可写 x 可执行

-      ---     ---     ---
type   owner  group    ohters
​
- rw- rw- rw-
d rw- rw- rw-
---,代表的文件读写可执行 字母 r w x,如果没有那个权限就用 - 代替

八进制表示权限

r  004
w  002
x  001
-  000
​
- rwx rwx rwx
- 4+2+1 4+2+1 4+2+1 
chomd 7 7 7
chomd 6 6 6

作业:

  • 将我的案例都自己写一遍

  • 利用定时器写一些小工具

  • 随机数写一个彩票生成器

预习:I/O,不预习很痛苦。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值