Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Вы могли сделать это.
adjusted_datetime = (datetime_from_form.to_time - n.hours).to_datetime
Можно просто вычесть меньше чем один целый день:
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
или некоторая другая безопасная арифметическая утилита.
Вы не сказали, что использует Вас, должен сделать из значения, которое Вы получаете, но что относительно того, чтобы просто делить Ваши часы на 24, таким образом, Вы вычитаете часть дня?
mydatetime = DateTime.parse(formvalue)
nhoursbefore = mydatetime - n / 24.0
РЕДАКТИРОВАНИЕ : Смотрите на этот вопрос , прежде чем Вы решите использовать подход, который я обрисовал в общих чертах здесь. Кажется, что это не может быть лучшая практика для изменения поведения базового класса в 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
Мне нравится использовать помощников в active_support. Это заставляет его действительно убрать и легкий читать.
Посмотрите пример ниже:
require 'active_support'
last_accessed = 2.hours.ago
last_accessed = 2.weeks.ago
last_accessed = 1.days.ago
мог бы быть способ использовать такой синтаксис, чтобы сделать то, что Вы ищете, если текущая дата используется.
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] и <<
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