2013-06-23 27 views
5

Tôi cần trợ giúp. Tôi đã cố gắng tìm ra lý do tại sao java util ngày là 5 giờ sau khi chuyển đổi từ C# bọ ve.C# Ticks chuyển đổi sang java util date; ngày là 5 giờ sau tại sao?

trong C#, ngày là 6/8/2013 11:02:07 SA, tôi chuyển đổi ngày này thành ve rồi chuyển nó sang java là long.

đoạn mã:

thực hiện:

- long TICKS_AT_EPOCH = 621355968000000000L; 
- long TICKS_PER_MILLISECOND = 10000; 

java.util.Date date = new java.util.Date((ctime - TICKS_AT_EPOCH)/TICKS_PER_MILLISECOND); 

Bây giờ java ngày util là Sat 08 Tháng Sáu 06:02:07 CDT 2013

Chú ý rằng giờ là 5 giờ sự khác biệt.

Mọi đề xuất tại sao?

+0

Tôi vẫn còn bối rối. Tôi đọc ngày tháng từ cơ sở dữ liệu SQL (máy chủ là trong thời gian Trung tâm) trong ứng dụng C# và gán nó cho đối tượng C# DateTime. Nó hiển thị ngày tháng và thời gian chính xác trong ứng dụng C# nhưng tôi không chắc chắn múi giờ mà DateTime được đặt thành. Làm thế nào để tôi tìm ra điều này? –

+0

Đây là những gì C# ứng dụng hiển thị cho ngày: Jun Sat 8 11:02 2013 -05: 00 –

Trả lời

0

ctime là UTC (Universal Coordinated Time), là tiêu chuẩn thời gian được tham chiếu đến Greenwich. Bạn đang thể hiện thời gian của mình trong thời gian Trung tâm. Có sự khác biệt của bạn.

1

Thời gian không phải là 5 giờ sau, chính xác là cùng một lúc. Vấn đề là với cách bạn in nó.

Bạn cần thông báo cho C# và Java sử dụng cùng múi giờ khi chuyển đổi ngày thành chuỗi. Một trong số họ đang sử dụng UTC và CDT khác.

5

Bạn đang xây dựng một java.util.Date dựa trên mili giây kể từ 1/1/1970 UTC. Dường như bạn đang sửa chữa từ thực tế là .net của System.DateTime.Ticks được dựa trên 1/1/0001 và là 10.000 ve đến một phần nghìn giây. Điều đó là đúng, nhưng bạn đã quên điều chỉnh sang UTC.

Trong .Net, giá trị đến từ DateTime.Ticks phụ thuộc nhiều vào thuộc tính DateTime.Kind. Có ba loại giá trị có thể là DateTime.

  • DateTimeKind.Utc - Loại này có nghĩa là giá trị thể hiện thời gian UTC. Nó thường xuất phát từ một cuộc gọi đến DateTime.UtcNow, nhưng cũng có thể được xây dựng trực tiếp và thường là. Ví dụ: bạn có thể truy xuất thời gian UTC từ cơ sở dữ liệu. Bạn có thể nạp các dấu tích từ đây trực tiếp vào chuyển đổi của bạn và nó sẽ hoạt động.

  • DateTimeKind.Local - Điều này thường xuất phát từ cuộc gọi đến DateTime.Now. Các giá trị đại diện cho múi giờ địa phương. Bạn sẽ cần phải chuyển đổi sang UTC trước khi kiểm tra bọ ve. Bạn có thể thực hiện các thao tác sau:

    DateTime dt = DateTime.Now; 
    int utcTicks = dt.ToUniversalTime().Ticks; 
    

    Lưu ý rằng nếu thời gian xảy ra trong quá trình chuyển đổi theo kiểu "tiết kiệm" vào ban ngày thì kết quả có thể không chính xác. Lớp DateTime không có ý tưởng về múi giờ. Nó chỉ phản ánh đồng hồ địa phương hiện tại. Nếu giá trị trong dt không rõ ràng, ToUniversalTime() sẽ giả định rằng giá trị đại diện cho giờ chuẩn, ngay cả khi bạn vừa truy xuất nó trong khi ở giờ ban ngày. Đây chỉ là một trong nhiều khía cạnh khó hiểu và có khả năng xảy ra của DateTime trong .net.

  • DateTimeKind.Unspecified - Đây là loại phổ biến nhất của DateTime bạn sẽ gặp phải, và thường xuất phát từ DateTime.Parse() hoặc một constructor như new DateTime(...). Thật không may, không có gì ở đây sẽ cho bạn biết về múi giờ những ngày này đại diện cho. Bạn vẫn có thể thử gọi .ToUniversalTime(), nhưng khung làm việc sẽ giả định rằng những thời gian này đại diện cho múi giờ địa phương của bạn, như thể loại này là Local. Giả định đó có thể hoàn toàn sai, tùy thuộc vào cách bạn có nguồn dữ liệu. Có thực sự không có cách nào an toàn để biến đổi UnspecifiedDateTime thành giá trị UTC (bọ ve hoặc cách khác).

Có một số giải pháp, chẳng hạn như sử dụng DateTimeOffset thay vì DateTime, hoặc sử dụng Noda Time thư viện thay vì được xây dựng trong các loại. Bạn có thể đọc thêm về các sự cố này herehere.

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