2010-09-14 58 views
21

Tương đương Java của DateTime.Ticks trong C# là gì?C# DateTime.Ticks tương đương trong Java

DateTime dt = new DateTime(2010, 9, 14, 0, 0, 0); 
Console.WriteLine("Ticks: {0}", dt.Ticks); 

Điều gì sẽ tương đương với mã được đề cập ở trên trong Java?

Trả lời

35

Vâng, java.util.Date/Calendar chỉ có độ chính xác xuống millisecond:

Calendar calendar = Calendar.getInstance();  
calendar.set(Calendar.MILLISECOND, 0); // Clear the millis part. Silly API. 
calendar.set(2010, 8, 14, 0, 0, 0); // Note that months are 0-based 
Date date = calendar.getTime(); 
long millis = date.getTime(); // Millis since Unix epoch 

Đó là tương đương với hiệu quả gần nhất. Nếu bạn cần chuyển đổi giữa giá trị .NET ticks và Date/Calendar, về cơ bản bạn cần thực hiện mở rộng quy mô (ticks to millis) và bù trừ (1st Jan 1AD đến 1st Jan 1970).

API và ngày giờ tích hợp sẵn của Java khá khó chịu. Cá nhân tôi khuyên bạn nên sử dụng Joda Time để thay thế. Nếu bạn có thể nói những gì bạn đang thực sự cố gắng làm, chúng tôi có thể giúp nhiều hơn.

EDIT: Được rồi, đây là một số mẫu mã:

import java.util.*; 

public class Test { 

    private static final long TICKS_AT_EPOCH = 621355968000000000L; 
    private static final long TICKS_PER_MILLISECOND = 10000; 

    public static void main(String[] args) { 
     long ticks = 634200192000000000L; 

     Date date = new Date((ticks - TICKS_AT_EPOCH)/TICKS_PER_MILLISECOND); 
     System.out.println(date); 

     TimeZone utc = TimeZone.getTimeZone("UTC"); 
     Calendar calendar = Calendar.getInstance(utc); 
     calendar.setTime(date); 
     System.out.println(calendar); 
    } 
} 

Lưu ý rằng đây xây dựng một ngày/Lịch đại diện cho UTC ngay lập tức các 2019/09/14. Biểu diễn .NET hơi mờ - bạn có thể tạo hai giá trị DateTime giống nhau ngoại trừ "loại" của chúng (nhưng do đó đại diện cho các phiên bản khác nhau) và chúng sẽ yêu cầu bằng nhau. Đó là một chút của một mớ hỗn độn :(

+0

Trong trường hợp hiện tại tôi đã lưu giá trị Ticks tính trong C#; bây giờ những gì tôi muốn là đọc giá trị đánh dấu đó và nhận được cùng một ngày trong Java. –

+1

@Asoo: Ok. Đi bộ để làm việc ATM - mã trong hai mươi phút. Về cơ bản chia cho các ve mỗi mili giây và trừ một phần bù. Bạn cũng nên ghi nhớ thời gian bù trừ múi giờ. –

+0

Cảm ơn @ Skeet .... Nhưng nếu tôi muốn tính toán ve trong Java và đọc chúng trong C# ..... tôi đã thử điều này nhưng nó không mang lại giá trị giống hệt nhau: TimeZone utc = TimeZone.getTimeZone ("UTC"); Lịch lịch = Calendar.getInstance (utc); calendar.set (2010,8,14,0,0,0); System.out.println (calendar.getTimeInMillis() * TICKS_PER_MILLISECOND + TICKS_AT_EPOCH); –

8

System.nanoTime() cung cấp cho bạn nano giây trong Java (từ 1.6). Bạn vẫn sẽ cần phải thay đổi/rescale, nhưng không chính xác sẽ bị mất.

+0

nanoTime không có gì với thời gian đồng hồ, có nghĩa là nó không thể được chuyển đổi hoặc so sánh với Ticks từ .net DateTime. Đây là trích dẫn từ javadoc: Phương pháp này chỉ có thể được sử dụng để đo thời gian trôi qua và không liên quan đến bất kỳ khái niệm nào khác về hệ thống hoặc đồng hồ treo tường. Giá trị trả về đại diện cho nano giây kể từ thời gian cố định nhưng tùy ý (có lẽ trong tương lai, vì vậy giá trị có thể âm). – Stas

12

Trong Java là:

long TICKS_AT_EPOCH = 621355968000000000L; 
long tick = System.currentTimeMillis()*10000 + TICKS_AT_EPOCH; 
+1

đó là câu trả lời ... cảm ơn bạn –

0

để chuyển đổi Net Bọ ve để millis sử dụng java này:

static final long TICKS_PER_MILLISECOND = 10000; 
long ticks = 450000000000L; // sample tick value 
long millis = (ticks/TICKS_PER_MILLISECOND); 
1

Căn cứ vào Jon Skeet tôi phát triển lớp này

import java.util.Calendar; 
import java.util.Date; 

public class DateHelper { 

    private static final long TICKS_AT_EPOCH = 621355968000000000L; 
    private static final long TICKS_PER_MILLISECOND = 10000; 

    public static long getUTCTicks(Date date){ 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(date); 

     return (calendar.getTimeInMillis() * TICKS_PER_MILLISECOND) + TICKS_AT_EPOCH; 

    } 

    public static Date getDate(long UTCTicks){ 

     return new Date((UTCTicks - TICKS_AT_EPOCH)/TICKS_PER_MILLISECOND); 

    } 

} 

Nó hoạt động cho tôi

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