新手问题 [已解决] date,datetime,time ,timestamp 用法怎样区分?

chairy11 · 2014年09月09日 · 最后由 msl12 回复于 2017年03月29日 · 12020 次阅读

问题:

好迷糊,迁移文件里, t.date t.datetime t.time t.timestamp 到底怎么区分?

我现在的理解:

只有日期就用 date,只有时间就用 time,timestamp 是默认生成"created_at"和"updated_at"的。 那 datetime 呢?同时要日期和时间时使用?

结论:

只使用 date 和 datetime,前者只有日期不带时刻,后者既有日期又有时刻。 datetime 如果只想要时刻,格式化显示即可。

rails 中不提倡使用 time 和 timestamp date 和 datetime 的区别 一个是日期 一个是日期 + 时间

#1 楼 @kingwkb 但有时候我不需要选日期,只需要选时间呢?是不是还是 time 才适用?

#2 楼 @chairy11 t.timestamp 与 t.datetime 的效果相同 t.timestamps 与 t.datetime :created_at; t.datetime :updated_at 的效果相同

# Model file
class Te < ActiveRecord::Base
end

# Migration file
create_table :tes do |t|
  t.date :date
  t.time :time
  t.datetime :datetime
  t.timestamp :timestamp

  # t.timestamps
  t.datetime :created_at; t.datetime :updated_at # same as 't.timestamps'
end

# schema.rb
create_table "tes", force: true do |t|
  t.date     "date"
  t.time     "time"
  t.datetime "datetime"
  t.datetime "timestamp"
  t.datetime "created_at"
  t.datetime "updated_at"
end

# Rails Console
2.0.0-p247 :001 > Te.create date: Date.today, time: Time.now, datetime: DateTime.now, timestamp: DateTime.now
 => #<Te id: 1, date: "2014-09-12", time: "2014-09-12 15:46:40", datetime: "2014-09-12 07:46:40", timestamp: "2014-09-12 07:46:40", created_at: "2014-09-12 07:46:40", updated_at: "2014-09-12 07:46:40">
2.0.0-p247 :002 > Te.last
 => #<Te id: 1, date: "2014-09-12", time: "2000-01-01 07:46:40", datetime: "2014-09-12 07:46:40", timestamp: "2014-09-12 07:46:40", created_at: "2014-09-12 07:46:40", updated_at: "2014-09-12 07:46:40">

PS: time 字段是否发生了什么?

#3 楼 @creeek 不懂…… 为什么之前的时候 time 的结果与 datetime 的结果不同?一个是 UTC 一个是本地时间? 为什么查询结果的 time 又跟 create 时得到的 time 不一样?

另外,没有不需要日期,只显示时间段的类型么?我只需要时间段部分,不要日期呢?

#4 楼 @chairy11 第一个问题:一个是 UTC,一个是本地时区时间,其实是相同的,只是显示的不同而已。 第二个问题:time 存储之后日期被重置,我也不知道原因(数据库?Rails 自动补全 date 部分?)。

最后的问题:可以通过调用 strftime 方法实现,根据显示格式的需求进行显示

2.0.0-p247 :001 > datetime = DateTime.now
 => Fri, 12 Sep 2014 16:53:18 +0800
2.0.0-p247 :002 > datetime.strftime('%Y-%m-%d') # date
 => "2014-09-12"
2.0.0-p247 :003 > datetime.strftime('%H:%M:%S') # time
 => "16:53:18"
2.0.0-p247 :004 > datetime.strftime('%Y-%m-%d %H:%M:%S') # datetime
 => "2014-09-12 16:53:18"
2.0.0-p247 :005 > datetime.strftime('%Y年%-m月%-d日') # date_zh
 => "2014年9月12日"
2.0.0-p247 :006 > datetime.strftime('%Y年%-m月%-d日 %H:%M:%S') # datetime_zh
 => "2014年9月12日 16:53:18"

PS:也可以通过设置 Time::DATE_FORMATS 来实现与上面相同的效果。

#5 楼 @creeek 哦,谢谢:)

#2 楼 @chairy11 如果我只想去年份该如何做

#7 楼 @lengcb 去年份?不要年份?数据库是肯定包含年份的,但你可以不显示。

t.datetime "datetime"
 t.datetime "timestamp"
 t.datetime "created_at"
 t.datetime "updated_at"

学习了 😄

需要 登录 后方可回复, 如果你还没有账号请 注册新账号