转换后日出日落时间相等

Sunrise and sunset time are equal after converting

我正在尝试转换 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分钟的差异? 谁能帮帮我

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。如果您希望 AMPM 这样,按照英语的习惯,最好指定英语语言环境。

按照评论中的建议,将纪元以来的秒数乘以 1000 以获得毫秒,这是可行的,但是像这样自己进行时间转换是一个坏习惯。虽然乘以 1000 看起来很简单,但它可能已经让阅读您的代码的人感到疑惑,而且这种转换很快就会变得复杂且容易出错。我们有经过充分验证的库方法来完成它们,这也使我们的代码可以自我记录:我使用 ofEpochSecond 方法已经说明数字以秒为单位,无需疑惑,一切都清楚了,我觉得。

如果你还没有达到 Android API 26 级并且你不想要外部依赖,请使用以下内容进行转换:

    TimeUnit.SECONDS.toMillis(sunrise)

这也更清楚地告诉 reader 您正在进行从秒到毫秒的转换。

你的代码出了什么问题?

你没有说明代码哪里出错了,但是我觉得从评论中就可以看出来了。当将自纪元以来的秒数视为毫秒时,日出时会得到 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,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接