日期筛选
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日期筛选相关的知识,希望对你有一定的参考价值。
问题
把年月日表示为 YYYYMMDD 这样的 8 位整数,然后把这个整数转换成二进制数并且逆序排列,再把得到的二进制数转换成十进制数,求与原日期一致的日期。求得的日期要在上一次东京奥运会(1964 年 10 月 10 日)到下一次东京奥运会(预定举办日期为 2020 年 7 月 24 日)之间。
例)日期为1966年7月13日时
???????①?YYYYMMDD格式→?19660713
???????②?转换成二进制数→?1001010111111111110101001
???????③?逆序排列→?1001010111111111110101001
???????④?把逆序排列得到的二进制数转换成十进制数→?19660713
……回到1966年7月13日(最初的日期)
package main
import (
"time"
"fmt"
"strconv"
)
func reverse(s string)string{
sLen := len(s)
var sSliRev []byte
for i:=sLen-1;i>=0;i--{
sSliRev = append(sSliRev,s[i])
}
return string(sSliRev)
}
func judge(s string)bool{
n,err := strconv.Atoi(s)
if err != nil{
panic(err)
}
sBin := fmt.Sprintf("%b", n)
sBinRev := reverse(sBin)
if sBin == sBinRev{
return true
}else{
return false
}
}
func main(){
start,err := time.Parse("20060102", "19641010")
if err != nil{
fmt.Println("get start time failed, ", err)
return
}
startUnix := start.Unix()
end,err := time.Parse("20060102", "20200724")
if err != nil{
fmt.Println("get start time failed, ", err)
return
}
endUnix := end.Unix()
days := (endUnix - startUnix) / 86400
var i int64
for i=0;i<=days;i++{
dateUnix := startUnix + i * 86400
date := time.Unix(dateUnix,0).Format("20060102")
if judge(date){
fmt.Println(date)
}
}
}
结果:
19660713
19660905
19770217
19950617
20020505
20130201
时间的遍历稍麻烦一些,进制转换、逆序,然后判断筛选。
以上是关于日期筛选的主要内容,如果未能解决你的问题,请参考以下文章