Вычтите n часы до DateTime в Ruby

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
43
задан Mateusz Konieczny 29 September 2018 в 04:57
поделиться

7 ответов

Вы могли сделать это.

adjusted_datetime = (datetime_from_form.to_time - n.hours).to_datetime
55
ответ дан Daniel Beardsley 11 November 2019 в 22:41
поделиться

Можно просто вычесть меньше чем один целый день:

two_hours_ago = DateTime.now - (2/24.0)

Это работает в течение многих минут и чего-либо еще также:

hours = 10
minutes = 5
seconds = 64

hours = DateTime.now - (hours/24.0) #<DateTime: 2015-03-11T07:27:17+02:00 ((2457093j,19637s,608393383n),+7200s,2299161j)>
minutes = DateTime.now - (minutes/1440.0) #<DateTime: 2015-03-11T17:22:17+02:00 ((2457093j,55337s,614303598n),+7200s,2299161j)>
seconds = DateTime.now - (seconds/86400.0) #<DateTime: 2015-03-11T17:26:14+02:00 ((2457093j,55574s,785701811n),+7200s,2299161j)>

, Если арифметические погрешности с плавающей точкой являются проблемой, можно использовать Rational или некоторая другая безопасная арифметическая утилита.

34
ответ дан Smar 11 November 2019 в 22:41
поделиться

Вы не сказали, что использует Вас, должен сделать из значения, которое Вы получаете, но что относительно того, чтобы просто делить Ваши часы на 24, таким образом, Вы вычитаете часть дня?

mydatetime = DateTime.parse(formvalue)
nhoursbefore = mydatetime - n / 24.0
4
ответ дан glenn mcdonald 11 November 2019 в 22:41
поделиться

РЕДАКТИРОВАНИЕ : Смотрите на этот вопрос , прежде чем Вы решите использовать подход, который я обрисовал в общих чертах здесь. Кажется, что это не может быть лучшая практика для изменения поведения базового класса в Ruby (который я могу понять). Так, возьмите этот ответ с мелкой частицей соли...

<час>

ответ MattW был первой вещью, о которой я думал, но мне также не нравился он очень.

я предполагаю, что Вы могли сделать его менее ужасным путем исправления DateTime и Fixnum, чтобы сделать то, что Вы хотите:

require 'date'

# A placeholder class for holding a set number of hours.
# Used so we can know when to change the behavior
# of DateTime#-() by recognizing when hours are explicitly passed in.

class Hours
   attr_reader :value

   def initialize(value)
      @value = value
   end
end

# Patch the #-() method to handle subtracting hours
# in addition to what it normally does

class DateTime

   alias old_subtract -

   def -(x) 
      case x
        when Hours; return DateTime.new(year, month, day, hour-x.value, min, sec)
        else;       return self.old_subtract(x)
      end
   end

end

# Add an #hours attribute to Fixnum that returns an Hours object. 
# This is for syntactic sugar, allowing you to write "someDate - 4.hours" for example

class Fixnum
   def hours
      Hours.new(self)
   end
end

Тогда можно записать код как это:

some_date = some_date - n.hours

, где n число часов, Вы хотите к substract от some_date

4
ответ дан 8 revs 11 November 2019 в 22:41
поделиться

Мне нравится использовать помощников в active_support. Это заставляет его действительно убрать и легкий читать.

Посмотрите пример ниже:

require 'active_support'

last_accessed = 2.hours.ago
last_accessed = 2.weeks.ago
last_accessed = 1.days.ago

мог бы быть способ использовать такой синтаксис, чтобы сделать то, что Вы ищете, если текущая дата используется.

2
ответ дан Smar 11 November 2019 в 22:41
поделиться

DateTime не может сделать, это, но Time может:

t = Time.now
t = t-hours*60

Примечание, которое Time также хранит информацию даты, это - все немного странное.

, Если необходимо работать с DateTime

DateTime.commercial(date.year,date.month,date.day,date.hour-x,date.minute,date.second)

, мог бы работать, но ужасен. В документе говорится DateTime, неизменно, таким образом, я даже не уверен [приблизительно 117] и <<

5
ответ дан MattW. 11 November 2019 в 22:41
поделиться

n / 24.0 трюк не будет работать должным образом, поскольку числа с плавающей запятой в конечном итоге округляются:

>> DateTime.parse('2009-06-04 02:00:00').step(DateTime.parse('2009-06-04 05:00:00'),1.0/24){|d| puts d}
2009-06-04T02:00:00+00:00
2009-06-04T03:00:00+00:00
2009-06-04T03:59:59+00:00
2009-06-04T04:59:59+00:00

Однако вы можете использовать вместо этого класс Rational:

>> DateTime.parse('2009-06-04 02:00:00').step(DateTime.parse('2009-06-04 05:00:00'),Rational(1,24)){|d| puts d}
2009-06-04T02:00:00+00:00
2009-06-04T03:00:00+00:00
2009-06-04T04:00:00+00:00
2009-06-04T05:00:00+00:00
9
ответ дан 11 November 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: