2013-07-04 2 views
4

Мне нужно тайному миллисекунды до настоящего времени по Гринвичу (в Android приложение), пример:миллисекунды до настоящего времени в GMT в Java

1372916493000

Когда я преобразовать его этим кодом:

Calendar cal = Calendar.getInstance(); 
cal.setTimeZone(TimeZone.getTimeZone("GMT")); 
cal.setTimeInMillis(millis); 
Date date = cal.getTime(); 

результатом является 07:41 07/04/2013. Результат такой же, когда я использую только:

Date date = new Date(millis); 

К сожалению, результат выглядит неправильно, это выглядит как мой по местному времени. Я попытался преобразовать тот же номер на this service, и результат 05:41 07/04/2013, который, я считаю, верен. Поэтому у меня разница в два часа. У кого-нибудь есть какие-либо предложения/советы, что не так с моей конверсией?

+0

Таким образом, чтобы быть ясно, вы хотите метку времени напечатанный в виде строки, используя часовой пояс GMT? –

+0

Попробуйте посмотреть в этом ответе: [Как преобразовать локальную дату GMT] [1] [1]: http://stackoverflow.com/questions/10599109/how-to-convert-a -local-date-to-gmt – Ahiel

+0

Принимали ли вы летнее время? –

ответ

13

Если результат, который выглядит некорректные средства System.out.println(date) то это не удивительно, потому что Date.toString преобразует дату в представление строки в локальной временной зоне.Для того, чтобы увидеть результат в GMT вы можете использовать этот

SimpleDateFormat df = new SimpleDateFormat("hh:ss MM/dd/yyyy"); 
df.setTimeZone(TimeZone.getTimeZone("GMT")); 
String result = df.format(millis); 
+0

Этот код не работает для меня .. Показ IlligalArgumentException –

1

попробовать этот

public class Test{ 
    public static void main(String[] args) throws IOException { 
     Test test=new Test(); 
     Date fromDate = Calendar.getInstance().getTime(); 
     System.out.println("UTC Time - "+fromDate); 
     System.out.println("GMT Time - "+test.cvtToGmt(fromDate)); 
    } 
    private Date cvtToGmt(Date date) 
     { 
      TimeZone tz = TimeZone.getDefault(); 
      Date ret = new Date(date.getTime() - tz.getRawOffset()); 

      // if we are now in DST, back off by the delta. Note that we are checking the GMT date, this is the KEY. 
      if (tz.inDaylightTime(ret)) 
      { 
       Date dstDate = new Date(ret.getTime() - tz.getDSTSavings()); 

       // check to make sure we have not crossed back into standard time 
       // this happens when we are on the cusp of DST (7pm the day before the change for PDT) 
       if (tz.inDaylightTime(dstDate)) 
       { 
       ret = dstDate; 
       } 
      } 

      return ret; 
     } 
} 

Результат теста:
UTC Время - Вс Май 15 16:24:14 IST 2012
GMT Time - Вс Май 15 10:54:14 IST 2012

дата
0

Date date = cal.getTime();

возвращает созданный через

public final Date getTime() { 
    return new Date(getTimeInMillis()); 
} 

, где getTimeInMillis() возвращает миллисекунды без какого-либо TimeZone.

Я хотел бы предложить, глядя здесь, как сделать то, что вы хотите how-to-handle-calendar-timezones-using-java

+0

Но есть ли время в миллисекундах на основе GMT ​​или часового пояса, в котором присутствует устройство/рабочий стол? – Satyam

2

Казалось вы перепутались с вашим домашним часовым поясом и часовым поясом UTC во время преобразования.

Давайте предположит, что вы находитесь в Лондоне (в настоящее время Лондон 1 час вперед по Гринвичу) и миллисекунд время в домашнем часовом поясе (в данном случае, Лондон).

Тогда, вы, вероятно, следует:

Calendar cal = Calendar.getInstance(); 
// Via this, you're setting the timezone for the time you're planning to do the conversion 
cal.setTimeZone(TimeZone.getTimeZone("Europe/London")); 
cal.setTimeInMillis(1372916493000L); 
// The date is in your home timezone (London, in this case) 
Date date = cal.getTime(); 


TimeZone destTz = TimeZone.getTimeZone("GMT"); 
// Best practice is to set Locale in case of messing up the date display 
SimpleDateFormat destFormat = new SimpleDateFormat("HH:mm MM/dd/yyyy", Locale.US); 
destFormat.setTimeZone(destTz); 
// Then we do the conversion to convert the date you provided in milliseconds to the GMT timezone 
String convertResult = destFormat.parse(date); 

Пожалуйста, дайте мне знать, если я правильно получить свою точку зрения?

Приветствия

1

Т.Л., д-р

Instant.ofEpochMilli(1_372_916_493_000L)   // Moment on timeline in UTC. 

2013-07-04T05: 41: 33Z

... и ...

Instant.ofEpochMilli(1_372_916_493_000L)   // Moment on timeline in UTC. 
     .atZone(ZoneId.of("Europe/Berlin")) // Same moment, different wall-clock time, as used by people in this region of Germany. 

2013-07-04T07: 41: 33 + 02: 00 [Europe/Berlin]

Детали

Вы используете хлопотно старые классы даты и времени в настоящее время вытеснен java.time классов.

java.time

Если у вас есть количество миллисекунд с начала эпохи отсчета даты первого момента 1970 в UTC, 1970-01-01T00: 00Z, а затем разобрать как Instant. Класс Instant представляет собой момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).

Instant instant = Instant.ofEpochMilli(1_372_916_493_000L) ; 

instant.toString(): 2013-07-04T05: 41: 33Z

Чтобы увидеть, что же одновременный момент через призму времени стены круглосуточному конкретного региона, применить часовой пояс (ZoneId), чтобы получить ZonedDateTime.

ZoneId z = ZoneId.of("Europe/Berlin") ; 
ZonedDateTime zdt = instant.atZone(z) ; 

zdt.toString(): 2013-07-04T07: 41: 33 + 02: 00 [Europe/Berlin]


О java.time

Рамка java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8, Java SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • Более поздние версии Android реализаций пачке классов java.time.
    • Для более ранних Android, проект ThreeTenABP адаптируется ThreeTen-Backport (упомянутый выше). См. How to use ThreeTenABP….
Смежные вопросы