## 18.日期和時間
Ruby 提供了從計算機時鐘中提取時間和日期的方法。 當今所有的個人計算機都有一個稱為 RTC(實時時鐘)的東西,它由電池供電,即使機器關閉也可以保持時間。 許多編程語言都允許我們訪問此時鐘并使用日期和時間進行操作。 讓我們看看如何使用 Ruby。 讓我們在 irb 中執行此操作,而不是將程序寫入文件中。
我們要做的第一件事是發現現在幾點鐘了? 為此,只需在 irb 中鍵入`Time.now`就可以了。 你將獲得當前時間。
```rb
>> Time.now
=> Thu Feb 25 16:54:45 +0530 2010
```
Time.now 是`Time.new`的同義詞,它創建一個新的`Time`對象。 你可以使用`Time.now`或`Time.new`,兩者將產生相同的結果。
```rb
>> Time.new
=> Thu Feb 25 16:54:48 +0530 2010
```
在以下命令中,我們創建一個新的時間對象/實例,并將其分配給變量`t`
```rb
>> t = Time.new
=> Thu Feb 25 16:55:02 +0530 2010
```
現在已經分配了,如何查看`t`的值? 我們將使用檢查方法。 因此,通過鍵入`t.inspect`,我們可以檢查 t 中的內容。
```rb
>> t.inspect
=> "Thu Feb 25 16:55:02 +0530 2010"
```
`t.inspect`將時間對象轉換為字符串并顯示給我們。 可以通過`to_s`(到字符串)功能完成相同的操作,如下所示
```rb
>> t.to_s
=> "Thu Feb 25 16:55:02 +0530 2010"
```
`t.year`檢索時間對象
```rb
>> t.year
=> 2010
```
`t.month`檢索月份對象
```rb
>> t.month
=> 2
```
`t.day`檢索時間對象中的當天(該月)
```rb
>> t.day
=> 25
```
`t.wday`檢索當天的數字。 0 表示星期日,1→星期一,2→星期二,依此類推,直到 6 表示星期六
```rb
>> t.wday
=> 4
```
在上面的代碼段中,星期四是星期四。
`t.yday`檢索該年中的日期。 例如,2 月 1 日是一年中的第 32 天。
```rb
>> t.yday
=> 56
```
`t.hour`檢索時間對象中的小時。 小時為 24 小時格式。
```rb
>> t.hour
=> 16
```
`t.min`檢索時間對象中的分鐘值。
```rb
>> t.min
=> 55
```
`t.sec`檢索時間秒對象。
```rb
>> t.sec
=> 2
```
`t.usec`檢索時間對象中的微秒。 如果你受命編寫奧運會秒表應用程序,這將很有用。
```rb
>> t.usec
=> 357606
```
`t.zone`檢索區域。 我在印度,在這里遵循印度標準時間,簡稱為 IST。
```rb
>> t.zone
=> "IST"
```
有一個東西叫做 UTC 或世界時間坐標 <sup class="footnote">[ [44](#_footnotedef_44 "View footnote.") ]</sup> 。 經度為 0 度的時間。 `t.utc_offset`顯示你的時間與 UTC 的時間相差的秒數。
```rb
>> t.utc_offset
=> 19800
```
從上面的示例中,我知道住在格林威治的人將在我見過 19800 秒后看到日出。
DST 表示夏令時 <sup class="footnote">[ [45](#_footnotedef_45 "View footnote.") ]</sup> 。 我不知道那是什么 如果你的時區具有夏令時,則此函數返回`true`,否則返回`false`。
```rb
>> t.isdst
=> false
```
如果你的時區為`UTC`,則`t.utc`返回 true 或 false
```rb
>> t.utc?
=> false
```
如果要獲取本地時間,只需如圖所示調用`localtime`函數。 在這種情況下,我們希望`t`保留本地時間值
```rb
>> t.localtime
=> Thu Feb 25 16:55:02 +0530 2010
```
與本地時間相同,`gmtime`功能獲取格林威治子午線時間。
```rb
>> t.gmtime
=> Thu Feb 25 11:25:02 UTC 2010
```
`getlocal`功能是`local_time`的別名
```rb
>> t.getlocal
=> Thu Feb 25 16:55:02 +0530 2010
```
`getutc`功能是`gmtime`的別名。 實際上,`gmtime`是`getutc`的別名
```rb
>> t.getutc
=> Thu Feb 25 11:25:02 UTC 2010
```
`ctime`函數將時間格式化為易于閱讀的格式。
```rb
>> t.ctime
=> "Thu Feb 25 11:25:02 2010"
```
假設我們要從時間值 t 中減去幾秒鐘,我們可以如圖所示。 下方,我們從時間值中減去 86400 秒(1 天)
```rb
>> t - 86400
=> Wed Feb 24 11:25:02 UTC 2010
```
### 18.1。 兩天之間的天數
現在,讓我們編寫一個代碼片段,以查找 2010 年 2 月 25 日至 2010 年 5 月 1 日之間的天數,首先,我們聲明一個變量`a`并將其分配給 2010 年 2 月 25 日,如圖所示
```rb
>> a = Time.local 2010, 2, 25
=> Thu Feb 25 00:00:00 +0530 2010
```
注意,我們在`Time`類中使用了一個名為`local`的函數,我們可以為其指定一個日期。 從輸出中可以看到,我們知道變量`a`的值現在為 2 月 25 日。 我們以類似的方式創建了一個變量`b`,并將其分配給日期為 2010 年 5 月 1 日的日期
```rb
>> b = Time.local 2010, 5, 1
=> Sat May 01 00:00:00 +0530 2010
```
我們現在要做的就是從 b 中減去 a
```rb
>> b -a
=> 5616000.0
```
這給出了 a 和 b 之間的秒數。 我們將結果除以 86400(即一天中的秒數)
```rb
>> days = _ / 86400
=> 65.0
```
我們得到的結果是 65。
### 18.2。 你住了幾天?
現在,讓我們看一個程序,該程序以你的生日為準,并打印出你住了多少天。 在文本編輯器中輸入程序并執行
```rb
#!/usr/bin/ruby
# how_many_days.rb
print "Enter birthday (YYYY-MM-DD):"
bday = gets.chop
year, month, day = bday.split('-')
# puts " #{year}, #{month}, #{day}"
seconds = Time.now - Time.local(year, month, day)
days = (seconds / 86400).round
puts "You have lived for #{days} days"
```
這是結果
```rb
Enter birthday (YYYY-MM-DD):2000-5-23
You have lived for 3566 days
```
好吧,這在你執行該程序時可能會有所不同。 現在讓我們對其進行分析。 在第一行
```rb
print "Enter birthday (YYYY-MM-DD):"
```
我們要求用戶輸入他或她的生日,完成后,我們將在此處進行提示。 我們要求用戶在語句中以 YYYY-MM-DD 格式輸入
```rb
bday = gets.chop
```
我們獲取日期并將其存儲在名為`bday`的變量中。 `gets.chop`獲得生日,并砍掉我們隨其輸入的輸入符號。 因此`bday`現在保存你輸入的生日的字符串值。 在下一條語句中
```rb
year, month, day = bday.split('-')
```
我們有一個多重分配,其中我有三個變量`year`,`month`和`day`。 我正在分割生日字符串并分配它。 真正發生的是,如果我們輸入一個類似于 1994-6-24 的日期,它會被`–`分割并變成一個數組,如下面的代碼片段所示,該數組在 irb 中執行
```rb
>> "1994-6-24".split '-'
=> ["1994", "6", "24"]
```
讓我們同時將此數組分配給變量`a`,`b`和`c`,如下所示
```rb
>> a, b, c = _
=> ["1994", "6", "24"]
```
如果你還記得`_`(下劃線)表示 irb 中最后獲得的結果。 因此,分配好之后,我們現在檢查`a`,`b`和`c`的值,如圖所示。
```rb
>> a
=> "1994"
>> b
=> "6"
>> c
=> "24"
```
以類似的方式
```rb
year, month, day = bday.split('-')
```
`year`變量獲取年份部分,`month`獲取月份,`day`獲取日期。 確定已經獲得了特定日期的參數,我們可以繼續進行。 檢查以下語句
```rb
seconds = Time.now - Time.local(year, month, day)
```
看到等號的右側,首先我們有`Time.now`可以獲取當前時間,從中減去使用`Time.local`創建的時間對象。 `Time.local`可用于創建固定在任何實例上的時間對象,該實例可以是過去,現在或將來。 我們將`year`,`month`和`day`傳遞給它以創建`Time`對象。 當我們將兩者都減去時會發生什么,我們得到了以秒為單位的差異,該差異存儲在等式左側的`seconds`變量中。
我們現在要做的就是將第二個轉換為幾天,這是下面的語句完成的
```rb
days = (seconds / 86400).round
```
在這里,我們將秒除以 86400,將秒轉換為天。 我們可能會得到 378.567 天之類的值,要擺脫.567,我們使用舍入函數將其舍入,因此`(seconds / 86400).round`返回一個整齊的舍入值,人類安靜下來可以輕松讀取。 我們將值存儲在名為`days`的變量中。 最后,我們使用以下語句打印出我們已經生活了很多天的事實
```rb
puts "You have lived for #{days} days"
```
好吧,就是這樣。
我想告訴我我使用`Time.local`函數發現的一件事,不是我們必須僅將數字傳遞給它,如圖所示
```rb
>> Time.local "2010", "5", "1"
=> Sat May 01 00:00:00 +0530 2010
```
我們可以傳遞一些人類友好的價值觀,如下所示。 而不是每月放置 5,我們使用 May。
```rb
>>Time.local "2010", "may", "1"
=> Sat May 01 00:00:00 +0530 2010
```
有時 Ruby 語言看起來像說英語一樣容易。
- 前言
- 紅寶石
- 先決條件
- 1.安裝 Ruby
- 2.在線資源
- 3.入門
- 4.比較與邏輯
- 5.循環
- 6.數組
- 7.哈希和符號
- 8.范圍
- 9.功能
- 10.可變范圍
- 11.類&對象
- 12.安全導航
- 13.打破大型程序
- 14.結構和 OpenStruct
- 15. Rdoc
- 16. Ruby 樣式指南
- 17.模塊和混入
- 18.日期和時間
- 19.文件
- 20. Proc,Lambda 和塊
- 21.多線程
- 22.異常處理
- 23.正則表達式
- 24.寶石
- 25.元編程
- 26.基準
- 27.測試驅動開發
- 28.觀察者模式
- 29.模板模式
- 30.工廠模式
- 31.裝飾圖案
- 32.適配器模式
- 33.單例模式
- 34.復合模式
- 35.建造者模式
- 36.策略模式
- 贊助商
- 捐
- 人們怎么說
- 版權
- 取得這本書