Время восхода и захода солнца после конвертации равны - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь преобразовать миллисекундный формат времени, предоставленный openweathermap, но когда я конвертирую их, время составляет всего 1 минуту.

Я попытался преобразовать, используя Simpledateformat.

fun formatTIme(sun:Date):String{
    val timeformat:SimpleDateFormat= SimpleDateFormat("h:m a")
    return  timeformat.format(sun)

}

sys": {
"type": 1,
"id": 9201,
"message": 0.0075,
"country": "NP",
"sunrise": 1571444437,
"sunset": 1571485599
},
"timezone": 20700,
"id": 1282682,
"name": "Thapathali",
"cod": 200
}

API call is done through Nepal, если это поможет. Почему время разницы всего в 1 минуту? Может ли кто-нибудь помочь мне

1 Ответ

3 голосов
/ 22 октября 2019

java.time и ThreeTenABP

Я сожалею, что могу писать только код Java. Я доверяю вам переводить. Для демонстрации я использую этот фрагмент.

    long sunrise = 1571444437;
    long sunset = 1571485599;
    System.out.println(formatTime(Instant.ofEpochSecond(sunrise)));
    System.out.println(formatTime(Instant.ofEpochSecond(sunset)));

Вывод:

6:05 AM
5:31 PM

Я объявил formatTime вот так - и он работает на вашем APIуровень, см. подробности ниже.

static final DateTimeFormatter formatter = DateTimeFormatter
        .ofPattern("h:mm a", Locale.ENGLISH)
        .withZone(ZoneId.of("Asia/Kathmandu"));

static String formatTime(Instant time) {
    return formatter.format(time);
}

Я указал двузначные минуты для получения 6:05, что является обычным, а не 6:5. Если вы предпочитаете последнее, замените mm на m в строке шаблона формата. Если вы хотите, чтобы AM и PM таким образом, как это принято в английском языке, было бы неплохо указать английскую локаль.

Умножение секунд с эпохи на 1000, чтобы получить миллисекунды, как предложено вкомментарии, работает, но делать ваши собственные преобразования времени, как это плохая привычка. Хотя умножение на 1000 кажется простым, это может оставить человека, читающего ваш код, интересующимся, и такие преобразования становятся сложными и подверженными ошибкам очень быстро. У нас есть хорошо зарекомендовавшие себя библиотечные методы для их выполнения, что также оставляет самодокументирование нашего кода: мое использование метода ofEpochSecond уже говорит о том, что число указывается в секундах, и не нужно удивляться, все понятно, яподумайте.

Если вы еще не находитесь на уровне API Android 26 и не хотите внешних зависимостей, используйте для конвертации следующее:

    TimeUnit.SECONDS.toMillis(sunrise)

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

Что пошло не так в вашем коде?

Вы не показали код, где он идет не так, но я думаю, это ясно из комментариев,Обрабатывая свои секунды с начала эпохи как миллисекунды, вы получаете 1970-01-19T10:00:44.437+05:30[Asia/Kathmandu] для восхода солнца и 1970-01-19T10:01:25.599+05:30[Asia/Kathmandu] для заката. Как вы заметили, между ними меньше минуты.

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

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

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

Ссылки

...