0

我有一个 rails/react 应用程序(只有一个应用程序),其中允许用户使用Flatpickr安排会议。

我正在传递一个名为“scheduled_for”的日期时间列,以便我可以在我的反应组件中使用它。

这就是我的“componentDidMount()”的样子:

componentDidMount = () => {
    new Flatpickr(this.refs.scheduledFor, {
      minDate: new Date(),
      enableTime: true,
      altInput: true,
      altFormat: "F j, Y h:i K", 
      onChange: function(dateObject) { console.log(dateObject) }
    });
  }

我的会议模型中有一个“scheduled_for_future”验证方法,以防止会议被安排在过去。

##app/models/meeting.rb

validate :scheduled_for_future

def scheduled_for_future 
  if scheduled_for.present? && scheduled_for < Time.zone.now
    errors.add(:scheduled_for, "Must be in future")
  end
end

我希望用户能够在当地时区选择日期和时间,并将其保存为 UTC(Heroku 默认值)。

在本地开发中一切正常,但如果我尝试在生产中选择时间和日期,例如从现在开始 10 分钟,我会收到“必须在未来”错误。(这显然是因为我的时区是 PT 并且根据服务器的时间从现在开始的 10 分钟是过去的)

感觉这应该很容易解决。为了用户体验,我希望客户能够在他们自己的时区中选择时间并在保存之前转换为 UTC,但就是想不通。

我对 momentjs 或 flatpickr 不是很有经验,所以我很可能错过了一些非常重要的东西。

如果您需要更多信息/某些东西没有意义,请告诉我。

太感谢了

4

1 回答 1

0

您可以使用 moment 在客户端格式化日期时间以包含时区偏移量。currDate,在您的情况下,将是您在 Flatpickr 日历中选择的日期时间。

var currDate = new Date();
console.log("Current Date: " + moment(currDate).format("YYYY-MM-DD HH:mm:ssZ"));

// Returns ...
Current Date: 2017-02-25 09:38:02-05:00

然后您可以将其作为字符串传递给 up rails,并将其转换为 UTC,然后再保存在数据库中

2.3.1 :003 > client_date = "2017-02-25 09:38:02-05:00"
 => "2017-02-25 09:38:02-05:00" 
2.3.1 :004 > utc_date = Time.zone.parse(client_date).utc
 => 2017-02-25 14:38:02 UTC 
于 2017-02-25T14:46:06.890 回答