2012-04-18 23 views

Trả lời

28

Ngày không có múi giờ vì chúng không đại diện cho thời gian.

Điều đó nói rằng, như đối với cách nó tính toán ngày hiện tại, chúng ta hãy nhìn vào chiết xuất này từ the code for Date.today:

time_t t; 
struct tm tm; 
// ... 
if (time(&t) == -1) 
    rb_sys_fail("time"); 
if (!localtime_r(&t, &tm)) 
    rb_sys_fail("localtime"); 

Sau đó tiến hành để sử dụng sử dụng tm để tạo ra các đối tượng Date. Vì tm có thời gian địa phương của hệ thống bằng cách sử dụng localtime(), Date.today do đó sử dụng thời gian địa phương của hệ thống chứ không sử dụng UTC.


Bạn luôn có thể sử dụng Time#utc trên bất kỳ Time chuyển đổi nó tại chỗ để UTC, hoặc Time#getutc để trả về một đối tượng mới tương đương Time trong UTC. Sau đó, bạn có thể gọi số Time#to_date để nhận số Date. Vì vậy: some_time.getutc.to_date.

Nếu bạn đang sử dụng ActiveSupport’s time zone support (có trong Rails), lưu ý rằng nó là hoàn toàn tách biệt với nhà xây dựng thời gian Ruby và không ảnh hưởng đến họ (tức là nó không thay đổi như thế nào Time.now hoặc Date.today làm việc). Xem thêm ActiveSupport extensions to Time.

+0

Cảm ơn bạn đã làm rõ. Tôi đoán một cách tốt hơn để đặt câu hỏi của tôi sẽ là "kết hợp với múi giờ nào Date.today trở lại ngày hôm sau?" Tôi cho rằng nếu tôi muốn "ngày hôm nay trong UTC", tôi sẽ cần phải làm một cái gì đó như 'Time.now.zone.to_date' (trong Rails). –

+0

'Time.zone.now.to_date' sẽ sử dụng bất kỳ múi giờ nào mà ứng dụng được cấu hình. Đó là giá trị nhìn vào 'Time.use_zone ('[tên khu vực]')' trong trường hợp bạn muốn thiết lập múi giờ cho một khối mã cụ thể, trong trường hợp này là UTC. –

+5

Có với quản lý múi giờ của ActiveSupport, bạn có thể thực hiện 'Time.zone.now.to_date' bằng' Time.current.to_date' bằng 'Date.current'. –

10

Ví dụ về Ngày được biểu diễn dưới dạng Số Ngày Julian Thiên văn; nó không có phần phân đoạn của một ngày. Trong khi một ngày Julian là tương đối so với GMT - vì vậy về mặt kỹ thuật một ví dụ của ngày nên được coi là trong GMT - cho hầu hết các mục đích bạn có thể bỏ qua và xử lý nó như không có múi giờ. Bạn sẽ chỉ quan tâm đến múi giờ nếu bạn chuyển đổi múi giờ thành Ngày giờ hoặc Thời gian.

Công cụ của ActiveSupport cho chuyển đổi ngày cho phép bạn chỉ định xem bạn có muốn giờ địa phương hay UTC hay không.

Ví dụ:

>> t = Date.today.to_time 
=> Wed Apr 18 00:00:00 -0400 2012 
>> t.zone 
=> "EDT" 
>> t = Date.today.to_time(:utc) 
=> Wed Apr 18 00:00:00 UTC 2012 
>> t.zone 
=> "UTC" 
+0

Xem nhận xét tôi đã đưa ra về câu trả lời của @ AndrewMarshall về lý do tôi hỏi câu hỏi gốc. Về cơ bản, tôi đang cố gắng tìm ra nếu Date.today trên hệ thống cục bộ sẽ giống như Date.today trên một hệ thống trong UTC. –

+1

Như Andrew nói, Date.today không tạo ra một ngày từ thời gian địa phương không UTC. Để nhận ngày tương ứng với thời gian ở UTC, hãy thử Time.now.utc.to_date –

+0

Tôi chỉ ra rằng trong khi đối với một số quốc gia, bỏ qua múi giờ của ngày có thể hoạt động, tại đây bạn có ngày sai hầu hết các ngày làm việc nếu bạn làm điều đó. (ví dụ: 10 giờ sáng ở địa phương vào ngày 13 tháng 2, tôi nghĩ, 2100 UTC vào ngày 12). – Rich

47

Bạn có thể lấy đi bằng cách sử dụng

Time.now.utc.to_date

trong ruby ​​

+3

Tốt hơn nhiều so với câu trả lời được chấp nhận. Tôi tự hỏi nếu điều này đã được thêm vào kể từ tháng 4 năm 2012. –

+2

đây là thông tin hữu ích, nhưng nó không trả lời câu hỏi. điều này trả lời cho câu hỏi liên quan "làm thế nào tôi có thể lấy ngày của thời gian UTC hiện tại?", người đăng ký hỏi liệu Date.today có ở UTC hay không, không phải cách lấy ngày tháng bằng utc. –

1

Nếu ứng dụng ray của bạn được cấu hình để chạy trong múi giờ UTC sau đó chỉ cần sử dụng Time.zone.today , nếu không, hãy ép buộc bằng cách sử dụng Time.now.utc.to_date

0

Bạn có thể sử dụng

Date.current 

Để có được ngày hiện tại trên múi giờ cấu hình.

Các vấn đề liên quan