当前位置: 首页 > 知识库问答 >
问题:

计算时间

况庆
2023-03-14

我正试图在RoR上创建一个计算时间的应用程序。

当您按下开始按钮时,它会拉Time.now,然后,当您按下停止时,它会再次拉Time.now,然后计算两者之间的时间量。然后它会通过to_i将给定的秒转换为整数,然后将整数秒计算为小时:分钟:秒

然而,我的代码出了点问题,它不停地抛出一个又一个错误。

当前顺序为 nil:NilClass 的“未定义方法 '-'”

def create
  @start_time = Time.now
end 

def destroy
  @stop_time = Time.now
end 

def show
  @total_time = hours_worked(total_time)
end 

private

def total_time
  total_time = @stop_time - @start_time
  return total_time.to_i
end 

def time_worked(seconds_worked)
  hours = seconds_worked / ( 60 * 60 )
  minutes = ( seconds_worked / 60 ) % 60
  seconds = seconds_worked % 60
  return "#{hours} + “:” + #{minutes} + “:” + #{seconds}"
end 

共有2个答案

上官华池
2023-03-14

唯一调用-的地方是在您的total_time方法中。因为它说“NoMethod-for nil class”,这意味着减号之前的变量是未定义的。所以在这里,这是@stop_time变量

看起来@stop_time只有在您调用create时才会被定义。如果您希望您的代码正常工作,您必须在调用total_time之前同时调用create销毁

我敢打赌你没有按顺序运行它们——在其他的之前调用< code > total _ time ——这就是你得到一个错误的原因。

吕树
2023-03-14

我认为您的潜在问题是您假设您的实例变量(@start_time@stop_time)在请求中保持不变。他们没有。每次您到达这些endpoint之一时,您都在处理一个全新的控制器实例,因此即使您之前调用了#creer#销毁,当您调用#show时,@start_time@stop_time都是nil

如果您确实希望数据跨请求持久化,则需要某种持久化机制,即数据库或键值存储。实例变量仅在单个请求/响应周期内保存在内存中。

 类似资料:
  • 问题内容: 在我的程序开始和结束时, 但是,当我尝试区别时,我会遇到语法错误…。我做错了一些事情,但是我不确定发生了什么… 基本上,我只想在程序开始时将时间存储在变量中,然后将第二次时间存储在末尾的第二个变量中,然后在程序的最后一位中计算差并显示出来。我不是要为功能速度计时。我正在尝试记录用户通过某些菜单花费的时间。做这个的最好方式是什么? 问题答案: 该模块将为您完成所有工作: 如果您不想显示微

  • 环境:PHP 7.3.13RC1;CentOS 7.7.1908;服务器时区“欧洲/柏林” 观察结果: 以下PHP脚本: 此输出中的结果: 鉴于我希望看到以下输出: 区别在于第二个日期的输出。UTC时间缩短一小时(22:01:00而不是21:01:00)。 我在这里不知所措。我试图在php.ini内设置一个默认时区,但无济于事。 使用“日期”和“日期-u”给了我正确的时间。 timedatectl

  • 我已经通过谷歌和堆栈溢出搜索,但我没有找到一个关于如何计算时间复杂度的清晰而直接的解释。 说代码像下面这样简单: 说一个像下面这样的循环: 这将只执行一次。 时间实际上被计算为而不是声明。

  • 问题内容: 中欧夏令时开始于三月的最后一个星期日。我们将时钟设置为02:00到03:00。如果我在数据库请求中进行时间戳计算会发生什么?比方说,在01:59? 结果是03:00还是02:00? 如果我们将时钟设置为03:00到02:00,那结束了呢? 时间从03:00更改为02:00之后…在02:00会发生什么?是02:59还是01:59? 应该如何处理?最佳实践以及Oracle Database

  • 问题内容: 如果用户输入为2255,而我的输出应为10分钟,那么我如何计算24小时内的时差。我的想法是将输入分为2个部分,2位数字和2位数字。前2位数字是小时,将其乘以60使其变为分钟。然后再加上第二个2位数字,然后计算出差异。我不想使用任何日期日历数据类型或API来解决它。谢谢 问题答案: 如何在不使用String chartAt的情况下获取前两位数字。 最高两位数:数字/ 100最低两位数:数