2012-06-28 2 views
1

Я создаю приложение для Android, у которого есть чат.
в этом чате i каждое сообщение, чтобы его время пришло подписи.
Мой вопрос следующий:
позволяет сказать, что время в моей стране X. Мой друг за границей, и его время составляет X минус 7 часов.
Я посылаю ему сообщение по адресу 16:00 по местному времени.
Я хочу избежать ситуации, когда он получит сообщение 09:00, сообщение которого будет подписано 16:00 (это время в будущем, если вы смотрите в глазах этого друга в своей стране).

есть способ, которым в моем телефоне будет написано сообщение 16:00, а в его телефоне будет написано 09:00? У меня есть способ конвертировать время в местное время?android java time

+0

Hi. Asaf, вы можете показывать локальное время, то есть когда вы читаете на своем телефоне, он назначает ваше местное время, и когда вы отправляете его на свой телефон, он будет преобразован в это местное время, может быть, вы упомянули, что можете вручную конвертировать и отправить сообщение со временем – MobileEvangelist

ответ

0

Используйте длинный, чтобы сохранить информацию о времени в миллисекундах с момента «эпохи» (которая составляет 1 января 1970 года, 00:00:00 по Гринвичу). Он может быть восстановлен с помощью метода Date.getTime(), а новые объекты Date легко создаются с использованием конструктора Date(long millis). Затем объекты Date отображаются с использованием настроек локального часового пояса на каждом устройстве.

РЕДАКТИРОВАТЬ:

эпоха представляет собой определенный момент времени, которая выражается по-разному в разных временных зонах: 1970-01-01 00:00:00 GMT но 1969-12-31 19: 00:00 EST. Временная метка - это всего лишь миллисекунды, прошедшие с этого времени. Так, например, временная отметка соответствует 2012-07-01 19:00:00 GMT и 2012-07-01 14:00:00 EST.

+0

, так что если мой длинный 12345 и 21:00, и я покажу его в другой стране, он может показать 14:00 из того же самого длинного? –

+0

Точно! Обычно это используется в Android, например, в протоколе биллинга в приложении. – ekholm

+0

не нужно как-то, в какую страну его конвертировать? –

1

Вы должны поддерживать связь по всему времени с использованием времени UTC. Затем локализуйте его для отображения на основе настроек текущего часового пояса.

+0

Я должен сказать, что я не совсем понял, как это сделать .. допустим, например, мое время в милисекундах, так как «eposch» составляет 12345, что составляет 21:00 01/01/2000 местного времени в Израиле. Я отправляю долго в Америку - это, скажем, минус 7 часов. так как может Америка показать 14:00 01/01/2000 от 12345? –

+0

@AsafNevo [Эта статья] (http://tutorials.jenkov.com/java-date-time/java-util-timezone.html) объясняет, как делать часовые пояса в java. – bluevector

0

Вам необходимо будет сохранить часовой пояс, в котором будет сохранено ваше сообщение, и передать его (или отправить время эпохи unix), а затем с другой стороны убедитесь, что вы прочитали его с использованием времени Locale (используя Документация на Android для таких вещей, как http://developer.android.com/reference/java/util/Calendar.html, может помочь).

2

System.currentTimeMillis() дает вам количество миллисекунд с 1 января 1970 года 00:00:00 по UTC. Объект Date не сохраняет ваш часовой пояс. Вы можете использовать DateFormats для преобразования дат в строки в любом часовом поясе:

DateFormat df = DateFormat.getTimeInstance(); 
df.setTimeZone(TimeZone.getTimeZone("gmt")); 
String gmtTime = df.format(new Date()); 

linked response

0

Избегайте java.util.Date/.Calendar

Классы java.util.Date/.Calendar в комплекте с Java (и Android), как известно, хлопотно, испорчены как в дизайне, так и в реализации.

Joda время

Joda-Time библиотеки является путем. Эта библиотека вдохновила пакет java.time, теперь встроенный в Java 8 (недоступный на Android).

UTC

Как и другие ответы предложили, лучшая практика (в целом), чтобы сохранить свой бизнес-логику и хранения данных/связи в UTC часовом поясе (который некоторые считают как без часового пояса или «анти» время зона). Отрегулируйте определенный часовой пояс только тогда, когда это ожидается пользователем или потребителем данных.

часовой пояс

DateTime класса в Joda-Time представляет собой значение даты и время вместе с назначенной временной зоной.

Обратите внимание, что лучше всего указать часовой пояс во всех ваших операциях. В противном случае вы будете неявно полагаться на текущий часовой пояс JVM. Это рискованно, потому что эта зона может измениться - даже во время выполнения в любой момент любым кодом в любом потоке любого приложения, работающего в JVM вашего приложения. И используйте proper time zone names, а не 3-4 буквенных кода.

Пример кода

Пример кода в Joda-Time 2.7.

DateTime sent = DateTime.now(DateTimeZone.getDefault()) ; 
DateTime sentUtc = nowMine.withZone(DateTimeZone.UTC) ; // Generally, use this for your work, including communicating to other threads and apps and such. 

При готовности к отображению другому пользователю отрегулируйте ожидаемый часовой пояс.

DateTimeZone zone = DateTimeZone.forID("America/Montreal") ; // Or DateTimeZone.getDefault() if you want to rely on their JVM’s current default. To be absolutely sure of expected time zone, you really must ask the user. 
DateTime sentMontréal = sentUtc.withZone(zone); 

Чтобы создать текстовое представление этих даты и времени объектов, искать много Вопросы и ответы на StackOverflow.com по этому вопросу. Найдите термины типа «joda» и «DateTimeFormatter» и «DateTimeFormat».