2015-09-16 26 views
14

Tại sao không phải là Time.current tương đương với tương đương được phân tích cú pháp của nó?Tại sao hai lịch biểu này lại khác nhau?

current = Time.current 
# Wed, 16 Sep 2015 17:10:56 CEST +02:00 
parsed = Time.zone.parse('16 Sep 2015 17:10:56') 
# Wed, 16 Sep 2015 17:10:56 CEST +02:00 
current == parsed 
# false <= What ?! 
current.to_i == parsed.to_i 
# true 
Ticket.create(datetime: current) 
# ... 
Ticket.find_by_datetime(parsed) 
# nil <= Why ?! 

Tôi thực sự gặp sự cố với ứng dụng Ruby on Rails nơi tôi cố gắng tìm bản ghi dựa trên thuộc tính datetime đã được phân tích cú pháp, như được hiển thị trên dòng cuối cùng.

Tôi thực sự không hiểu. Các múi giờ giống nhau, thời gian bằng nhau đến vài giây. Điều gì đang xảy ra ở đây?

Hơn nữa, tôi nên tiến hành như thế nào để tìm một bản ghi dựa trên ngày giờ được phân tích cú pháp?

+5

Đồng hồ máy tính của bạn có thể có độ chính xác phụ thứ hai ;-) (gợi ý: 'to_f') – Stefan

+0

Cảm ơn! Được rồi, vì vậy, ngày giờ được phân tích cú pháp không có độ chính xác phụ thứ hai. Nhưng sau đó tôi nên làm gì để lấy bản ghi trong cơ sở dữ liệu? –

+1

Hoặc cắt bớt thuộc tính thành toàn bộ giây trước khi lưu nó vào cơ sở dữ liệu hoặc vượt qua một phạm vi bao gồm toàn bộ giây: 'Ticket.where (datetime: parsed ... parsed + 1)' – Stefan

Trả lời

5

Cảm ơn mọi người đã trợ giúp. Tôi hy vọng bạn không nhớ nhưng vì những câu trả lời cuối cùng nằm rải rác trên nhiều câu trả lời, tôi sẽ trả lời câu hỏi của riêng tôi về những gì bạn nói.

Vì vậy, đối với lý do tại sao các ngày khác nhau, đó là vì mất mili giây trong giờ ngày được phân tích cú pháp. Như @ dimakura đã đề cập.

current.to_f #=> 1442417032.6567826 
parsed.to_f #=> 1442417032.0 

Sau đó, câu trả lời về cách chúng tôi có thể tìm nạp bản ghi Ticket dựa trên ngày giờ được phân tích cú pháp. Trước tiên, điều quan trọng là phải biết điều này sẽ chỉ liên quan đến PostgreSQL (trường hợp của tôi) hoặc các cơ sở dữ liệu khác thực sự lưu trữ mili giây. Nhờ @sjagr đã đề cập đến điều này.

Vì vậy, chúng ta phải truy vấn cho một phạm vi từ phân tích để phân tích cú pháp + 1 giây, giống như @Stefan giải thích:

Ticket.where(datetime: parsed...parsed+1).first 

Và nếu chúng ta có quyền kiểm soát trên việc tạo ra vé, chúng tôi cũng có thể loại bỏ sự chính xác phần nghìn giây trước lưu cơ sở dữ liệu. Nhờ @sjagr để cung cấp một cách dễ dàng để làm điều đó.

current = Time.current 
Ticket.create(datetime: current.change(usec: 0)) 

Cảm ơn mọi người!

21

Họ không phải là giống nhau:

current.to_f #=> 1442417032.6567826 
parsed.to_f #=> 1442417032.0 

Khi phân tích cú pháp, bạn bỏ lỡ mili giây.

+1

Sau đó, bạn có thể mở rộng cách chúng tôi có thể tìm nạp bản ghi trong DB dựa trên chuỗi được phân tích cú pháp không có độ chính xác mili giây không? –

+1

@JeremyF. Bạn có thể in 'ticket.datetime.to_f' không? – dimakura

+0

1442416256.115874 –

3

Đó là vì chúng không bằng nhau, chúng khác nhau theo các phần của giây. Những gì bạn thấy trong bảng điều khiển là kết quả của phương pháp inspect được gọi vào những ngày đó, theo mặc định, thả bất kỳ phần phụ thứ hai nào.

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