代码之家  ›  专栏  ›  技术社区  ›  Kevin Won

f日期范围生成器?

  •  5
  • Kevin Won  · 技术社区  · 16 年前

    我正在尝试编写一个函数,该函数使用生成器语法生成日期时间列表:

    let dateRange = 
    
        let endDate = System.DateTime.Parse("6/1/2010")
        let startDate = System.DateTime.Parse("3/1/2010")
    
        seq {
              for date in startDate..endDate do
                  if MyDateClass.IsBusinessDay(date) then yield date
            }
    

    但是生成器(“seq”)块没有正确解析。它需要一个时间跨度。虽然生成器语法似乎非常适合我要做的事情,但是它对于除了两个数字以外的任何东西都是不直观的。

    1. 是否可以使用生成器语法创建日期时间范围?
    2. 有没有比我写的更好的方法来考虑如何创建范围(即“in”子句)
    2 回复  |  直到 16 年前
        1
  •  5
  •   Alexander Rautenberg    16 年前

    let rec dates (fromDate:System.DateTime) (toDate:System.DateTime) = seq {
                if fromDate <= toDate then 
                    yield fromDate
                    yield! dates (fromDate.AddDays(1.0)) toDate
                }
    

    let result = dates startDate endDate |> Seq.filter (fun dt -> IsBusinessDate(dt))
    
        2
  •  11
  •   kvb    16 年前

    TimeSpan Zero startDate .. TimeSpan(1,0,0,0) .. endDate

    open System
    
    type TimeSpanWrapper = { timeSpan : TimeSpan } with
      static member (+)(d:DateTime, tw) = d + tw.timeSpan
      static member Zero = { timeSpan = TimeSpan(0L) }
    
    let dateRange =
        let endDate = System.DateTime.Parse("6/1/2010")
        let startDate = System.DateTime.Parse("5/1/2010")
        let oneDay = { timeSpan = System.TimeSpan(1,0,0,0) }
    
        seq {
              for date in startDate .. oneDay .. endDate do
                 if MyDateClass.IsBusinessDay(date) then yield date
            }