码迷,mamicode.com
首页 > 其他好文 > 详细

日期筛选

时间:2018-07-07 20:21:47      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:表示   get   rtu   ack   orm   time   append   atoi   进制转换   

问题
把年月日表示为 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

时间的遍历稍麻烦一些,进制转换、逆序,然后判断筛选。

日期筛选

标签:表示   get   rtu   ack   orm   time   append   atoi   进制转换   

原文地址:http://blog.51cto.com/johnnyloo/2138588

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!