【问题标题】:Convert API timezone in seconds to GMT timezone. Also convert API temperature to deg celcius以秒为单位将 API 时区转换为 GMT 时区。还将 API 温度转换为摄氏度
【发布时间】:2019-09-19 09:29:01
【问题描述】:

我正在从某个天气网站获取 API 天气数据。 它为我提供了 19800 时区,我想将其转换为 GMT + 05:30,但我不能这样做。

它还给出了 297.58 的温度,我想将其转换为摄氏度。

我尝试假设给定温度为 deg Kelvin 并从中减少 273 但它不起作用

我希望能够将秒转换为时区并以摄氏度显示温度。

【问题讨论】:

  • 您似乎在问两个问题(以秒为单位的偏移量转换为以小时为单位的偏移量,以及将摄氏度转换为开尔文)。请edit它,这样只有一个问题。您可以在另一个帖子中发布您的其他问题。此外,您应该显示一些代码,作为您遇到的问题的minimal reproducible example。
  • 我也会假设 297.58 是开尔文。如果减去 273 不起作用,我没有进一步的建议。 它不起作用到底是什么意思?如果您得到意想不到的结果,请告诉我们您的预期以及观察到的结果有何不同。如果您收到错误消息,请逐字引用。谢谢。
  • 不工作是指结果值不是预期的值。但是该网站提到该值以开尔文为单位。我想这是我的一些错误。

标签: java android api timezone temperature


【解决方案1】:

使用 java.time 进行偏移量转换

知道怎么做就很简单:

    int offsetSeconds = 19_800;
    ZoneOffset offset = ZoneOffset.ofTotalSeconds(offsetSeconds);
    System.out.println("Offset is " + offset);

输出是:

偏移量为 +05:30

接下来您可以使用获取的ZoneOffset 对象来转换日期和时间。详细信息取决于您的日期和时间格式。

温度转换

我同意你的温度看起来很像开尔文度数。如果是这样,@Lt 在另一个答案中给出的公式。 Null 是正确的:

    double temperatureKelvin = 297.58;
    double temperatureCelsius = temperatureKelvin - 273.15;
    System.out.println("Temperature is " + temperatureCelsius + " degrees Celsius");

温度为 24.430000000000007 摄氏度

许多小数来自floating point math most often being inaccurate。 (为了准确,请改用BigDecimal。)对于向用户输出的内容,您可能希望打印更少的小数。如果是这样,请使用NumberFormat 和/或DecimalFormat 格式化数字。

如果 24.43 °C 与您的预期不一致,您至少需要告诉我们您的预期。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6。

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,这是现代类的后向端口(JSR 310 的 ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

  • 您有什么理由在变量 int offsetSeconds 中使用 19_800 吗?这个数字可能会有所不同,因为我从天气站点获取 API 数据,所以不能坚持 19800。这个数字只是一个例子
  • 我明白这一点。我以 19800 为例,但由于在我的代码示例中,我选择将其作为常量(字面量)给出,以免对我的代码在这个特定示例中的作用产生任何疑问,为了便于阅读,我更喜欢将其键入为 19_800 .它没有功能上的区别,正如您所说,由于您是从真实代码中的 API 获取数字,所以您不必关心。
【解决方案2】:

为您的时区转换器使用这个

 long unix_seconds = 19800; 
       Date date = new Date(unix_seconds*1000L); 
       // format of the date 
       SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
       formate.setTimeZone(TimeZone.getTimeZone("GMT+5:30"));
       String dateFinal = formate.format(date);
       System.out.println("\n"+dateFinal+"\n");

找到开尔文度数只需使用 297.58K − 273.15 = 24.43°C

【讨论】:

  • 请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API, 和它的DateTimeFormatter 中有很多更好的东西。是的,您可以在 Android 上使用它。对于较旧的 Android,请参阅 How to use ThreeTenABP in Android Project。
  • 结果是1970-01-01 11:00:00 GMT+05:30。时区是按要求的,但否则我想知道这是否是需要的。只有原来的提问者才能知道。我在回答中也随意使用了你的温度转换公式,希望你不介意。
猜你喜欢
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
相关资源
最近更新 更多