2

我正在编写一个脚本,该脚本应该根据日期范围确定一年中的“季节”:

例如:

January 1 - April 1: Winter
April 2 - June 30: Spring
July 1 - September 31: Summer
October 1 - December 31: Fall

我不确定如何以最好的方式(或最好的红宝石方式)去做这件事。其他人遇到如何做到这一点?

4

4 回答 4

6

9 月 31 日?

正如 leifg 所建议的,这里是代码:

require 'Date'

class Date

  def season
    # Not sure if there's a neater expression. yday is out due to leap years
    day_hash = month * 100 + mday
    case day_hash
      when 101..401 then :winter
      when 402..630 then :spring
      when 701..930 then :summer
      when 1001..1231 then :fall
    end
  end
end

一旦定义,就可以这样称呼它:

d = Date.today
d.season
于 2013-03-14T17:28:55.260 回答
2

您可以尝试使用范围和日期对象:

http://www.tutorialspoint.com/ruby/ruby_ranges.htm

于 2013-03-14T16:33:20.363 回答
1

没有范围。

  require 'date'

    def season
      year_day = Date.today.yday().to_i
      year = Date.today.year.to_i
      is_leap_year = year % 4 == 0 && year % 100 != 0 || year % 400 == 0
      if is_leap_year and year_day > 60
        # if is leap year and date > 28 february 
        year_day = year_day - 1
      end

      if year_day >= 355 or year_day < 81
        result = :winter
      elsif year_day >= 81 and year_day < 173
        result = :spring
      elsif year_day >= 173 and year_day < 266
        result = :summer
      elsif year_day >= 266 and year_day < 355
       result = :autumn
      end

      return result
    end
于 2013-06-07T17:26:16.287 回答
0

尼尔斯莱特的回答方法很棒,但对我来说,这些日期并不完全正确。他们显示秋季将于 12 月 31 日结束,在我能想到的任何情况下都不是这样。

利用北方气象季节:

  • 春季从 3 月 1 日持续到 5 月 31 日;
  • 夏季从 6 月 1 日持续到 8 月 31 日;
  • 秋季(秋季)从 9 月 1 日到 11 月 30 日;和
  • 冬季从 12 月 1 日到 2 月 28 日(闰年的 2 月 29 日)。

代码需要更新为:

require "date"

class Date
  def season
    day_hash = month * 100 + mday
    case day_hash
      when 101..300 then :winter
      when 301..531 then :spring
      when 601..831 then :summer
      when 901..1130 then :fall
      when 1201..1231 then :winter
    end
  end
end
于 2019-01-22T08:57:48.623 回答