Отображение правильного времени восхода / захода солнца с использованием отметки времени unix - PullRequest
0 голосов
/ 07 мая 2020

Я получаю метку времени UNIX от DarkSkyApi для времени восхода и захода солнца для выбранного места, и я хочу преобразовать ее в формат DateTime и отобразить ее пользователю. Я хочу, чтобы значения времени были локальными.

Пример случая: пользователь находится в Италии и выбирает «Токио, JP» в качестве желаемого местоположения для получения информации о погоде. Значения времени восхода и захода солнца должны быть отформатированы и показаны как местное время. Так что для Токио восход солнца должен быть примерно в 4:34 и 18:36 для заката.

С тем, что у меня есть прямо сейчас, я получаю неправильные значения, такие как 12:17 для восхода солнца и 2:29 для заката. Есть идеи, что я здесь делаю не так?

PS tmz var - это часовой пояс выбранного места, поэтому в данном случае это будет «Азия / Токио». Вот что я делаю прямо сейчас для времени заката (то же самое для времени восхода):

private fun setViewHolderWeekDaySunsetTime(holder: ViewHolder, sunsetTime: Long, tmz: String) {
    val dt = Instant.ofEpochSecond(sunsetTime).atZone(
        ZoneId.of(tmz)
    )
    val formatted = dt.format(DateTimeFormatter.ofPattern("HH:mm"))
    holder.weekDaySunsetTime.text = formatted
}

Ответы [ 2 ]

0 голосов
/ 19 мая 2020

Используйте эту функцию, чтобы найти часовой пояс каждого места по широте и долготе:

fun timezonecalculator(latitude:Double,longitude:Double):Double {
    val resultTimeZone = TimezoneMapper.latLngToTimezoneString(latitude, longitude)
    var tz= TimeZone.getTimeZone(resultTimeZone).getDisplayName(
        TimeZone.getTimeZone(resultTimeZone).inDaylightTime(Date()), TimeZone.SHORT)
    if ((tz=="GMT")||(tz=="UTC")||(tz=="WET"))
        tz+="+00:00"
    if ((tz=="CST")||(tz=="MDT"))
        tz+="-06:00"
    if (tz=="AST")
        tz+="-04:00"
    if ((tz=="EST")||(tz=="CDT"))
        tz+="-05:00"
    if (tz=="MST")
        tz+="+05:00"
    if ((tz=="CET")||(tz=="BST"))
        tz+="+01:00"
    if (tz=="EET")
        tz+="+02:00"
    if (tz=="CEST")
    {tz+="+02:00"
        tz=tz.drop(1)}
    if (tz=="PDT")
        tz+="-07:00"
    if (tz=="EDT")
        tz+="-04:00"
    if (tz=="EEST")
    {tz+="+03:00"
    tz=tz.drop(1)}
    if (tz=="WEST")
    {tz+="+01:00"
        tz=tz.drop(1)}
    var sign=tz[3]
    tz=tz.drop(4)
    val minute=tz.drop(3)
    val hour=tz.dropLast(3)
    val min=Integer.parseInt(minute)
    val hou=Integer.parseInt(hour)
    var timezone=hou+(min.toDouble()/60)
    if (sign=='-')
        timezone*=-1
    return timezone
}

И класс TimeZoneMapper - https://raw.githubusercontent.com/drtimcooper/LatLongToTimezone/master/src/main/java/com/skedgo/converter/TimezoneMapper.java

См. Здесь чтобы узнать, как использовать этот класс: https://github.com/drtimcooper/LatLongToTimezone

Вы вызываете его таким образом: timezonecalculator(latitude, longitude)

Пример: timezonecalculator(36.2, 59.6) Вывод: 4.5

0 голосов
/ 08 мая 2020

похоже, что api возвращает разные часовые пояса в зависимости от того, в каком городе вы запрашиваете данные

Итак, принимая это во внимание, при преобразовании метки времени в объект datetime вам нужно сделать что-то вроде этого:

import java.time.*

val dt = Instant.ofEpochSecond(/*put time value here*/)
                .atZone(/*put time zone here*/)
                .toLocalDateTime() //this will convert it to your system's date time
...