下一个付款日期另存为日期时间 rails
next payment date save as datetime rails
我正在尝试设置一种方法来创建比较这些列的每日计划:
我正在存储贝宝 IPN next_payment_date
,其格式与默认 rails 格式不同
例子
贝宝ipn
"next_payment_date"=>"03:00:00 Oct 06, 2015 PDT"
rails
created_at: "2015-10-05 14:24:17"
这些是不同的格式,我不太确定 rails 是否可以比较它们。
例如
我试过将 next_payment_date
存储为这样的 datetime
subscription = Subscription.find_by(paypal_recurring_profile_token: params[:recurring_payment_id])
if params[:next_payment_date]
subscription.update_attributes(paid_until: params[:next_payment_date])
end
这是 paypal 日期:
"next_payment_date"=>"03:00:00 Oct 06, 2015 PDT"
这就是 rails 存储的内容
paid_until: "2015-10-05 03:00:06"
看起来 rails 确实知道一点,但它不会转换月和日,只是时间。
存储这些参数的正确方法是什么?
编辑
架构:
create_table "payment_notifications", force: :cascade do |t|
t.text "params"
t.integer "user_role_id"
t.string "status"
t.string "transaction_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
t.string "txn_type"
t.string "recurring_payment_profile_id"
end
create_table "subscriptions", force: :cascade do |t|
t.integer "user_role_id"
t.integer "user_id"
t.string "paypal_customer_token"
t.string "paypal_recurring_profile_token"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "paid_until"
t.boolean "canceled", default: false
end
编辑 2
正在尝试转换字符串时间,但似乎有问题:
irb(main):006:0> PaymentNotification.last.params[:next_payment_date]
PaymentNotification Load (1.9ms) SELECT "payment_notifications".* FROM "payment_notifications" ORDER BY "payment_notifications"."id" DESC LIMIT 1
=> "03:00:00 Oct 07, 2015 PDT"
irb(main):007:0> PaymentNotification.last.params[:next_payment_date].to_time
PaymentNotification Load (4.7ms) SELECT "payment_notifications".* FROM "payment_notifications" ORDER BY "payment_notifications"."id" DESC LIMIT 1
=> 2015-10-06 03:00:07 +0000
Created_at 是 ActiveSupport::TimeWithZone
class.
我猜 next_payment_date 要么是 Date
要么是 DateTime
class- 但是再次- 运行 .class 来计算这个出。
让您感到困惑的是,您不知道为什么 rails 以不同的方式显示它们 - 这是因为没有相同的对象 - 每个对象都是不同的 class。
所以:
1) 检查 class 他们是
2) 决定要转换的class。
3) 比较它们。
示例:(假设 paid_until 为 UTC)
> next_payment_date_timezone_pdt = ActiveSupport::TimeZone["Pacific Time (US & Canada)"].parse("03:00:00 Oct 06, 2015 PDT")
=> Tue, 06 Oct 2015 03:00:06 PDT -07:00
> next_payment_date_timezone_utc = next_payment_date_timezone.in_time_zone('UTC')
=> Tue, 06 Oct 2015 10:00:06 UTC +00:00
> paid_until_timezone_utc = ActiveSupport::TimeZone['UTC'].parse('2015-10-05 03:00:06')
=> Mon, 05 Oct 2015 03:00:06 UTC +00:00
现在您可以比较它们了。
这是主要思想-您应该根据需要进行调整。
有一些不同的 ruby/rails classes 处理日期和时间。检查您正在使用的不同对象上的 class。示例(在 rails 控制台中):
2.2.2 :011 > Date.current.class
=> Date
2.2.2 :012 > Time.now.class
=> Time
2.2.2 :013 > DateTime.now.class
=> DateTime
2.2.2 :014 > Time.zone.now.class
=> ActiveSupport::TimeWithZone
关于处理这些 classes 的不错参考:http://stevenyue.com/2013/03/23/date-time-datetime-in-ruby-and-rails/
我正在尝试设置一种方法来创建比较这些列的每日计划:
我正在存储贝宝 IPN next_payment_date
,其格式与默认 rails 格式不同
例子
贝宝ipn
"next_payment_date"=>"03:00:00 Oct 06, 2015 PDT"
rails
created_at: "2015-10-05 14:24:17"
这些是不同的格式,我不太确定 rails 是否可以比较它们。
例如
我试过将 next_payment_date
存储为这样的 datetime
subscription = Subscription.find_by(paypal_recurring_profile_token: params[:recurring_payment_id])
if params[:next_payment_date]
subscription.update_attributes(paid_until: params[:next_payment_date])
end
这是 paypal 日期:
"next_payment_date"=>"03:00:00 Oct 06, 2015 PDT"
这就是 rails 存储的内容
paid_until: "2015-10-05 03:00:06"
看起来 rails 确实知道一点,但它不会转换月和日,只是时间。
存储这些参数的正确方法是什么?
编辑
架构:
create_table "payment_notifications", force: :cascade do |t|
t.text "params"
t.integer "user_role_id"
t.string "status"
t.string "transaction_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
t.string "txn_type"
t.string "recurring_payment_profile_id"
end
create_table "subscriptions", force: :cascade do |t|
t.integer "user_role_id"
t.integer "user_id"
t.string "paypal_customer_token"
t.string "paypal_recurring_profile_token"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "paid_until"
t.boolean "canceled", default: false
end
编辑 2
正在尝试转换字符串时间,但似乎有问题:
irb(main):006:0> PaymentNotification.last.params[:next_payment_date]
PaymentNotification Load (1.9ms) SELECT "payment_notifications".* FROM "payment_notifications" ORDER BY "payment_notifications"."id" DESC LIMIT 1
=> "03:00:00 Oct 07, 2015 PDT"
irb(main):007:0> PaymentNotification.last.params[:next_payment_date].to_time
PaymentNotification Load (4.7ms) SELECT "payment_notifications".* FROM "payment_notifications" ORDER BY "payment_notifications"."id" DESC LIMIT 1
=> 2015-10-06 03:00:07 +0000
Created_at 是 ActiveSupport::TimeWithZone
class.
我猜 next_payment_date 要么是 Date
要么是 DateTime
class- 但是再次- 运行 .class 来计算这个出。
让您感到困惑的是,您不知道为什么 rails 以不同的方式显示它们 - 这是因为没有相同的对象 - 每个对象都是不同的 class。
所以: 1) 检查 class 他们是
2) 决定要转换的class。
3) 比较它们。
示例:(假设 paid_until 为 UTC)
> next_payment_date_timezone_pdt = ActiveSupport::TimeZone["Pacific Time (US & Canada)"].parse("03:00:00 Oct 06, 2015 PDT")
=> Tue, 06 Oct 2015 03:00:06 PDT -07:00
> next_payment_date_timezone_utc = next_payment_date_timezone.in_time_zone('UTC')
=> Tue, 06 Oct 2015 10:00:06 UTC +00:00
> paid_until_timezone_utc = ActiveSupport::TimeZone['UTC'].parse('2015-10-05 03:00:06')
=> Mon, 05 Oct 2015 03:00:06 UTC +00:00
现在您可以比较它们了。 这是主要思想-您应该根据需要进行调整。
有一些不同的 ruby/rails classes 处理日期和时间。检查您正在使用的不同对象上的 class。示例(在 rails 控制台中):
2.2.2 :011 > Date.current.class
=> Date
2.2.2 :012 > Time.now.class
=> Time
2.2.2 :013 > DateTime.now.class
=> DateTime
2.2.2 :014 > Time.zone.now.class
=> ActiveSupport::TimeWithZone
关于处理这些 classes 的不错参考:http://stevenyue.com/2013/03/23/date-time-datetime-in-ruby-and-rails/