go语言,根据开始日期和结束日期计算出时间段内所有日期

此博客介绍了如何使用Go语言函数GetBetweenDates,通过输入开始和结束日期字符串,生成这两个日期之间的所有日期列表,确保日期格式一致且处理了异常情况。
// GetBetweenDates 根据开始日期和结束日期计算出时间段内所有日期
// 参数为日期格式,如:2020-01-01
func GetBetweenDates(sdate, edate string) []string {
   d := []string{}
   timeFormatTpl := "2006-01-02 15:04:05"
   if len(timeFormatTpl) != len(sdate) {
      timeFormatTpl = timeFormatTpl[0:len(sdate)]
   }
   date, err := time.Parse(timeFormatTpl, sdate)
   if err != nil {
      // 时间解析,异常
      return d
   }
   date2, err := time.Parse(timeFormatTpl, edate)
   if err != nil {
      // 时间解析,异常
      return d
   }
   if date2.Before(date) {
      // 如果结束时间小于开始时间,异常
      return d
   }
   // 输出日期格式固定
   timeFormatTpl = "2006-01-02"
   date2Str := date2.Format(timeFormatTpl)
   d = append(d, date.Format(timeFormatTpl))
   for {
      date = date.AddDate(0, 0, 1)
      dateStr := date.Format(timeFormatTpl)
      d = append(d, dateStr)
      if dateStr == date2Str {
         break
      }
   }
   return d
}

 

Go语言中爬取指定日期范围内一个网站的所有文件,可以使用`net/http`库获取网页内容,然后解析HTML来找到需要的链接,利用`time`库处理日期范围,并结合第三方库如`goquery`进行HTML解析。这里是一个大致的步骤: 1. **导入必要的包**: - `net/http`: 发送HTTP请求 - `time`: 处理日期时间 - `github.com/PuerkitoBio/goquery`: 解析HTML文档 2. **定义函数**: - `parseDateRange(dateStart, dateEnd)`: 根据给定的开始结束日期计算URL的时间戳范围 - `fetchPage(url)`: 发起HTTP GET请求并返回响应体 - `getFilesFromHTML(doc, startDate, endDate)`: 使用`goquery`遍历HTML查找目标文件链接 3. **主函数**: - 初始化一个日期范围 - 对于每个时间段内的每一天,生成对应的URL(假设日期编码在URL中) - 递归抓取每个页面的文件链接,添加到结果列表中 - 存储或下载文件 以下是一个简单的伪代码示例: ```go package main import ( "fmt" "log" "net/http" "time" "github.com/PuerkitoBio/goquery" ) // 示例代码,需替换实际函数实现 func parseDateRange(start, end time.Time) (int64, int64) { // 日期范围转为时间戳 startTimestamp := start.Unix() endTimestamp := end.Unix() return startTimestamp, endTimestamp } func fetchPage(url string) (*http.Response, error) { resp, err := http.Get(url) if err != nil { log.Println(err) return nil, err } return resp, nil } func getFilesFromHTML(doc *goquery.Document, startDate, endDate int64) []string { var files []string doc.Find("a[href]").Each(func(i int, s *goquery.Selection) { link := s.AttrOr("href", "") if startsWithinTimeRange(link, startDate, endDate) { // 自定义函数检查链接是否包含日期范围 files = append(files, link) } }) return files } func startsWithinTimeRange(link string, startDate, endDate int64) bool { // 在此判断link是否表示一个日期,并且在这个日期范围内 // 如果是,返回true,否则false // 可能需要解析link的内容或结构来完成这个任务 // 示例: d, err := time.Parse("2006-01-02", link) // 假设日期格式是"YYYY-MM-DD" if err == nil && d.After(time.Unix(startDate, 0)) && d.Before(time.Unix(endDate, 0)) { return true } return false } func main() { startDate := time.Date(2023, time.January, 1, 0, 0, 0, 0, time.UTC) endDate := time.Date(2023, time.January, 31, 0, 0, 0, 0, time.UTC) for startDate.Before(endDate) { url := "https://example.com/files?date=" + startDate.Format("2006-01-02") // 假设日期是URL的一部分 resp, err := fetchPage(url) if err != nil { continue } defer resp.Body.Close() doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { log.Println(err) continue } foundFiles := getFilesFromHTML(doc, startDate.Unix(), endDate.Unix()) fmt.Printf("On %s found:\n", startDate.Format("2006-02")) for _, file := range foundFiles { fmt.Println(file) } startDate.Add(24 * time.Hour) // 更新日期到下一天 } } ``` 请注意,这只是一个基本框架,实际操作可能会更复杂,因为网站的HTML结构日期的提取方式各不相同,可能需要定制化的解析逻辑。此外,尊重网站的robots.txt规则以及遵守相关法律法规是非常重要的。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值