Преобразование часовых минут в строковое время в utc и наоборот - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь взять строку в формате «ЧЧ: мм» и преобразовать ее из локального в utc и наоборот.Вот что у меня получилось:

    private String doTimeConversion(String time, boolean type) {

    DateFormat dfLocal = new SimpleDateFormat("HH:mm");
    DateFormat dfUTC   = new SimpleDateFormat("HH:mm");
    TimeZone local =  TimeZone.getDefault();
    TimeZone utc   =  TimeZone.getTimeZone("UTC");

    dfLocal.setTimeZone(local);
    dfUTC.setTimeZone(utc);

    Date date;
    String newTime = "00:00";
    try {
        //If true: local to utc/If false: utc to local
        if (type) {
            date = dfLocal.parse(time);
            newTime = dfUTC.format(date);
        } else {
            date = dfUTC.parse(time);
            newTime = dfLocal.format(date);
        }

    } catch (ParseException e) {
        e.printStackTrace();
    }
    return newTime;
}

Кажется, это работает в основном, но проблема, с которой я столкнулся, заключается в том, что, хотя я должен захватывать время устройств с помощью TimeZone.getDefault (), этобез учета летнего времени.Вместо изменения 12:00 (UTC) на 08:00 (ПО ВОСТОЧНОМУ ВРЕМЕНИ) вместо этого оно изменяется на 07:00 (EST).

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

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Используя ThreeTenABP, я смог преобразовать свой код в следующее:

    /**
     * @param d      int arr that holds date vals
     * @param from   Time zone to convert from
     * @param to     Time zone to convert to
     * @return       Converted date as String
     */
    protected String doConvertTime(int[] d, ZoneId from, ZoneId to, DateTimeFormatter format){
        LocalDateTime before = LocalDateTime.of(d[0], d[1], d[2], d[3], d[4]);
        ZonedDateTime beforeTime = ZonedDateTime.of(before, from);
        ZonedDateTime afterTime = beforeTime.withZoneSameInstant(to);
        return afterTime.format(format);
    }

int [] d:

Я анализирую частиСтроки, которые содержат значения и помещают их в целочисленный массив, который передается в функцию, показанную выше.Это казалось проще, чем разбор непосредственно из строки, потому что я работаю с несколькими строками.Таким образом, я могу убедиться, что все данные объединены в одну область.

ZoneId от & ZoneId до:

Я инициализировал два ZoneId в начале основной функции, так что я могу использовать их взаимозаменяемо.Например, локально до utc: от = local, до = utc / utc до local: от = utc, до = local.В действительности можно использовать любые два часовых пояса.

Формат DateTimeFormatter:

Я только хотел вернуть строку в формате "MM / dd / yy" или«ЧЧ: мм», потому что так разделяются мои строки, содержащие эти значения.Однако мне нужны все данные, относящиеся к дате, чтобы убедиться, что часовой пояс используется должным образом, а день, месяц или даже год не меняются из-за изменения часового пояса.Например, 2018-12-31 22:00 (EST) "Америка / Нью-Йорк" -> 2019-01-01 03:00 (UTC) (смещение -05: 00) Если бы у меня было только значение времени (ЧЧ: мм)тогда дата не изменилась бы.

0 голосов
/ 16 октября 2018

java.time

import org.threeten.bp.LocalDate;
import org.threeten.bp.LocalDateTime;
import org.threeten.bp.LocalTime;
import org.threeten.bp.ZoneId;
import org.threeten.bp.ZoneOffset;
import org.threeten.bp.ZonedDateTime;

public class ConvertTimeToAndFromUtc {

    /** @param type If true: local to utc/If false: utc to local */
    private static String doTimeConversion(String time, boolean type) {
        ZoneId localZone = ZoneId.systemDefault();
        LocalTime lt = LocalTime.parse(time);
        LocalDateTime ldt = LocalDate.now(localZone).atTime(lt);
        ZonedDateTime resultTime;
        if (type) {
            resultTime = ldt.atZone(localZone).withZoneSameInstant(ZoneOffset.UTC);
        } else {
            resultTime = ldt.atOffset(ZoneOffset.UTC).atZoneSameInstant(localZone);
        }
        LocalTime newTime = resultTime.toLocalTime();
        return newTime.toString();
    }

    public static void main(String[] args) {
        System.setProperty("user.timezone", "Asia/Gaza");

        System.out.println("09.21 local to UTC: " + doTimeConversion("09:21", true));
        System.out.println("23:13 UTC to local: " + doTimeConversion("23:13", false));
    }

}

Сегодня вышеприведенная программа напечатана (проверено на Java 7):

09.21 local to UTC: 06:21
23:13 UTC to local: 02:13

В данный момент полоса Газа находится по смещению +03: 00год и +02: 00 в стандартное / обычное время, поэтому, похоже, что конверсия учитывает летнее время (летнее время) (последняя конверсия проходит в полночь).

Я использую java.time, современныйAPI даты и времени Java.Используемые вами классы даты и времени DateFormat, SimpleDateFormat, TimeZone и Date давно устарели и имеют ряд проблем с дизайном.И они не очень подходят для рассматриваемой проблемы.

Вопрос: Могу ли я использовать java.time на Android?

Да, java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (начиная с уровня API 26) современный встроенный API.Только в этом случае импортируйте классы даты и времени из пакета java.time (не org.threeten.bp).
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. ссылки внизу).
  • На более старых версиях Android используется Android-версия ThreeTen Backport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...