Время без даты - PullRequest
       20

Время без даты

1 голос
/ 03 марта 2020

Я получаю время с часовым поясом (без компонента даты) с сервера PostgreSQL на json, например { "time": "03:00:00+01" }. Как мне справиться с этим в Android? Есть ли структура, которая может содержать только время без даты? Или преобразовать его в представление эпохи Date, т. Е. Thu Jan 01 03:00:00 GMT+01:00 1970 является единственным хорошим решением?

Ответы [ 3 ]

1 голос
/ 04 марта 2020

OffsetTime от java .time и ThreeTenABP

. OffsetTime - это время суток без даты и со смещением от UT C. Таким образом, он очень точно моделирует информацию в вашей строке из JSON. Так что я бы явно предпочел это больше Date. Кроме того, класс Date плохо спроектирован и сильно устарел.

    String timeStringFromJson = "03:00:00+01";
    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ssX");
    OffsetTime parsedTime = OffsetTime.parse(timeStringFromJson, timeFormatter);
    System.out.println("Parsed time: " + parsedTime);

Выходные данные этого фрагмента:

Время анализа: 03: 00 + 01: 00

В качестве детали, которая может иметь или не иметь значения для вас, смещение от строки сохраняется, в отличие от того, что может сделать Date, поскольку Date не имеет часового пояса или смещения.

Вопрос: Разве java .time не требует Android API уровня 26?

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

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

Ссылки

0 голосов
/ 04 марта 2020

Вы можете преобразовать метку времени String в миллисекунды с начала эпохи как значение long, затем сохранить / получить значение long и преобразовать его обратно в метку времени String, как показано ниже в main.

Я предполагаю, что +01 в вашем примере относится к центральноевропейскому времени.

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class SDFTest {

    /**
    Global SimpleDateFormat
    */
    private static SimpleDateFormat sdf = null;

    public static void main(String[] args) {
        // Initialize the Simple Date Format;
        sdf = new SimpleDateFormat("HH:mm:ssX");
        // Ignore this if you need timestamps converted to your local TimeZone;
        sdf.setTimeZone(TimeZone.getTimeZone("CET"));

        // Say this is the supplied time String;
        String suppliedDate = "03:00:00+01";

        // Convert from String timestamp to long;
        long convertedToTimeStamp = getTimeStamp(suppliedDate);
        System.out.println(suppliedDate + " => " + convertedToTimeStamp + "ms");

        // Convert from long timestamp to String;
        String convertedBackToString = getDateString(convertedToTimeStamp);
        System.out.println(convertedToTimeStamp + "ms => " + convertedBackToString);
    }


    /**
    Converts String timestamp to the number of milliseconds since Epoch.
    */
    private static long getTimeStamp(String date_str) {
        try {
            Date date = sdf.parse(date_str);
            return date.getTime();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
    Converts long timestamp to String
    */
    private static String getDateString(long timestamp) {
        try {
            Date date = new Date(timestamp);
            return sdf.format(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

Вывод:

Convert String timestamp to long and back

Поскольку компонент Date отсутствует в suppliedDate, он никогда не будет иметь значения.

0 голосов
/ 03 марта 2020

Вы можете проанализировать свою дату в Date объект, используя SimpleDateFormat со следующим шаблоном:

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");

try
    {
    Date date = format.parse("03:00:00+01", Locale.getDefault());
    Log.d( "debugDate", " date is: " + date );
    }
catch (ParseException e)
    {
    e.printStackTrace();
    }

Вывод:

Thu Jan 01 03:00:00 GMT+01:00 1970

В случае, если ваша структура даты станет «03: 00: 00 + 01: 00», вам нужно использовать этот шаблон:

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ssZ", Locale.getDefault());

Выход:

Thu Jan 01 03:00:00 GMT+01:00 1970
...