2013-03-25 21 views
14

Những gì tôi đang cố gắng làm:Tại sao phương thức getOffset() của joda DateTimeZone yêu cầu một "tức thì"?

Từ một đối tượng DateTimeZone, tôi đang cố gắng để có được bù đắp GMT theo mili giây. Ví dụ:

DateTimeZone gmt= // somehow get gmt zone object 
long offset = gmt.getOffsetSomehow(); // expect offset = 0 

DateTimeZone ny_est = // somehow get that time zone object representing "EST" offset of NY zone 
long offset = ny_est.getOffsetSomehow(); // expect offset = -18000000 = -5*60*60*1000 

DateTimeZone hkt = // somehow get HK time zone object 
long offset = hkt.getOffsetSomehow(); // expect offset = 28800000 = 8*60*60*1000 

Đối tượng DateTimeZone của Joda có phương pháp được gọi là getOffset, chấp nhận tham số. Câu hỏi:

  1. tại sao phương pháp đó cần tham số? Tôi đã mong đợi phương thức không mong đợi bất kỳ tham số nào, và chỉ đơn giản là hành xử như thế nào tôi muốn phương thức "getOffsetSomehow()" hư cấu của tôi.
  2. Làm cách nào để nhận các đối tượng múi giờ trong đoạn mã của tôi ở trên?
  3. Phương pháp/đoạn mã thực tế nào có thể mang lại cho tôi giá trị "bù đắp" mà tôi đang cố gắng đạt được?
+0

@jrharshanth Nếu bạn đang đặt câu hỏi; và nếu câu trả lời đang làm việc cho bạn; bạn có thể chấp nhận câu trả lời. –

+0

Tôi cũng muốn biết câu trả lời cho điều này. Tôi đã khởi tạo và lưu một DateTimeZone bằng cách sử dụng 'DateTimeZone.forOffsetMillis (...)' trong một phần của ứng dụng của tôi, và bây giờ tôi muốn lấy lại offset để tôi có thể lưu giá trị int hoặc long trong cơ sở dữ liệu. Giả định đối tượng DateTimeZone lưu trữ offset trong một trong các trường instance của nó. Không có cách nào rõ ràng để lấy dữ liệu đó. – Aquarelle

Trả lời

12

Điều này là do Bù đắp thay đổi theo thời gian. Một ví dụ là thời gian tiết kiệm ánh sáng ban ngày. Khác là một quốc gia quyết định chuyển sang múi giờ khác.

Nếu bạn muốn hiện tại bù đắp, chỉ cần nộp tại như thế này:

int offset = DateTimeZone.forID("Europe/Berlin").getOffset(new DateTime()); 
System.out.println(offset); 
+0

phương thức getOffset() là một phương thức trừu tượng không phải là phương thức tĩnh của lớp DateTimeZOne. Vì vậy, thông qua đối tượng của lớp DateTimeZone chỉ có nó có thể được truy cập. ví dụ \t \t DateTimeZone dtz = DateTimeZone.forID ("America/Port_of_Spain"); // America/New_York, Asia/Kolkata \t \t DateTimeZone.setDefault (dtz); \t \t Ngày giờ dt = new DateTime (2013, 3, 10, 3, 0, dtz); \t \t dtz.getOffset (dt.getMillis()); –

+0

Bạn đã đúng, đã sửa ví dụ của tôi. Tuy nhiên, câu trả lời của tôi vẫn giống nhau: Người ta phải cung cấp ngay lập tức (còn gọi là thời điểm) khi yêu cầu bù TZ, vì nó thay đổi theo thời gian –

0

2) Bạn có thể nhận đối tượng TimeZone bằng cách này - TimeZone tz = TimeZone.getTimeZone("Asia/Kolkata"); Value

3 Bạn có thể được bù đắp bằng phương pháp này -

double timezoneval = 0.0; 
     Calendar cal = Calendar.getInstance(); 
     cal.set(2013, 3, 25, 10, 0,0); 
     TimeZone tz = TimeZone.getDefault(); 
     boolean t = tz.inDaylightTime(cal.getTime()); 
     if (t) 
      timezoneval = ((TimeZone.getDefault().getRawOffset()) 
        /(60 * 60 * 1000D) + (TimeZone.getDefault() 
        .getDSTSavings()/(60 * 60 * 1000D))); 
     else 
      timezoneval = ((TimeZone.getDefault().getRawOffset())/(60 * 60 * 1000D)); 

1) Tôi không nhận được câu hỏi của bạn.

Giá trị offset này sẽ được áp dụng cho tiết kiệm ánh sáng ban ngày và quốc gia tiết kiệm ánh sáng ban ngày.

+0

Bạn có thể đặt bất kỳ id chuỗi múi giờ hợp lệ nào thay vì "Asia/Kolkata để nhận múi giờ Bạn có thể sử dụng API thời gian Joda để dễ dàng hơn trong tính toán thời gian ngày trong Java –

+0

Nếu bạn đang sử dụng DateTimZone của JodaTime Api, bạn phải sử dụng phương thức tĩnh lớp DateTimeZone Tôi đã giả định rằng bạn đang sử dụng Java.util. DateTime –

+0

Nếu nó phù hợp với bạn, hãy chấp nhận câu trả lời –

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