Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby-DateTime库解析错误(bug?)_Ruby_Datetime_Hash - Fatal编程技术网

Ruby-DateTime库解析错误(bug?)

Ruby-DateTime库解析错误(bug?),ruby,datetime,hash,Ruby,Datetime,Hash,有人能验证我的日期时间转换错误吗 我拥有的是从日期库生成的一周中的天数作为数字fixnum键的散列。我对散列进行了排序,并希望将fixnum键转换为一周中的几天(即0-->周日) 我的散列输出是{3=>7,2=>1,4=>2}(使用dh=hash[dh.sort]我将得到{2=>1,3=>7,4=>2}) 排序之后,我尝试执行一个。每个都执行 dh = {3=>7, 2=>1, 4=>2} dh=Hash[dh.sort] dh.each do |day,reg| #

有人能验证我的日期时间转换错误吗

我拥有的是从日期库生成的一周中的天数作为数字fixnum键的散列。我对散列进行了排序,并希望将fixnum键转换为一周中的几天(即0-->周日)

我的散列输出是
{3=>7,2=>1,4=>2}
(使用
dh=hash[dh.sort]
我将得到
{2=>1,3=>7,4=>2}

排序之后,我尝试执行一个。每个都执行

dh = {3=>7, 2=>1, 4=>2}
dh=Hash[dh.sort]

dh.each do |day,reg|
    #puts day.class
    #puts day="3" # This works

    day=day.to_s  ##<<== problem here: error "invalid date" when evaluated by strptime
                  ## if don't do day.to_s conversion, error "can't convert fixnum into string"
    #day="#{day}" ## does not work either

    wday= DateTime.strptime(day,'%d') ##<<== and problem here

    puts wday.strftime("%a")
    puts wday   
      end
dh={3=>7,2=>1,4=>2}
dh=散列[dh.sort]
dh.每做一天,注册|
#每天上课
#放置day=“3”#此操作有效
day=day.to#u##这项工作

=> dh = {3=>2, 2=>7}
=> {3=>2, 2=>7}
=> dh = Hash[dh.sort]
=> {2=>7, 3=>2}
=> dh.each { |day,reg| DateTime.strptime(day,'%d') }
=> TypeError: no implicit conversion of Fixnum into String
=> dh.each { |day,reg| puts DateTime.strptime(day.to_s,'%d') }
=> 2013-12-02T00:00:00+00:00
=> 2013-12-03T00:00:00+00:00
=> {2=>7, 3=>2}

编辑以反映所指出的正确原因

好的,我解决了问题

我最初使用的是

datestamp = DateTime.strptime(datestr, '%m/%d/%y %H:%M')
datestamp.wday
创建一个散列,其中#wday值作为键。这些#wday值是0-6之间的数字,表示周日和周六


当我使用
DateTime.strtime(day,'%d')
时,我应该使用%w开关。正确的语句应该是
DateTime.strtime(day.to_s,'%w')

如果我理解正确,您会混淆正确的DateTime格式。如果您需要处理工作日编号,则需要输入
%w
,而不是
%d
,即每月的第几天

dh = {3=>7, 2=>1, 4=>2, 0=>5}.sort
dh.each do |day,reg|
  day=day.to_s
  wday= DateTime.strptime(day,'%w')
  puts wday.strftime("%a")
end

# Sun
# Tue
# Wed
# Thu

你能把它简化为一行并给出预期输出和实际输出吗?仅仅说“它不起作用”是不起作用的。翻译会出错。“不能将FixNum转换成字符串……”或“无效日期”可以简化为一行吗?@ JAMEX,上面的代码工作正常,您可能需要添加解释器错误信息。关于“代码>日期时间”。StrpTimes(“3”,“%D”)< /代码>?谢谢,原始代码工作,但我发现了我认为是日期库的设计错误。strTime方法无法将“0”识别为一周中的有效日期(也称为星期日)。见我的解释。