Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么从UTC时间戳转换时,我总是得到错误的日期/时间?_Java_Android_Android Studio_Date_Utc - Fatal编程技术网

Java 为什么从UTC时间戳转换时,我总是得到错误的日期/时间?

Java 为什么从UTC时间戳转换时,我总是得到错误的日期/时间?,java,android,android-studio,date,utc,Java,Android,Android Studio,Date,Utc,我正在尝试制作一个天气预报应用程序,api给了我一个UTC时间戳:OpenWeatherMap。我通过创建日期对象将其转换为日期。例如,对于UTC时间戳158920000,UTC时间为5月11日下午6点。我做这个转换,我总是得到5月11日下午2点。巧合的是,我确实生活在一个时间比UTC晚4小时的地方,但当我使用假gps位置转换器测试我的应用程序时,我仍然得到了5月11日下午2点。这表明Android并没有根据我的当前位置创建日历,因为迪拜的时区并没有落后4小时 这是我的密码: public St

我正在尝试制作一个天气预报应用程序,api给了我一个UTC时间戳:OpenWeatherMap。我通过创建日期对象将其转换为日期。例如,对于UTC时间戳158920000,UTC时间为5月11日下午6点。我做这个转换,我总是得到5月11日下午2点。巧合的是,我确实生活在一个时间比UTC晚4小时的地方,但当我使用假gps位置转换器测试我的应用程序时,我仍然得到了5月11日下午2点。这表明Android并没有根据我的当前位置创建日历,因为迪拜的时区并没有落后4小时

这是我的密码:

public String convertDate(long unixTimeStamp) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat("EEEE, MMM d, h:mm aaa");
        Date date = new Date(unixTimeStamp*1000 );
        String nowDate = dateFormat.format(date);

        return nowDate;
    }

帮自己一个忙,使用
java.time.*
而不是
Date
/
SimpleDateFormat

如果您不能使用API 26/Gradle 4.x或更高版本(因此可以访问Java 8),那么在您可以使用之前,您可以通过Jake Wharton的改编在Android上使用:

要转换自历元以来的一个瞬间,请执行以下操作:

    val instant = Instant.ofEpochMilli(milliseconds)

    val result = instant.atOffset(ZoneOffset.UTC).toLocalDateTime() //for example
有很多方法可以利用

不要忘记为要加载的时区数据库初始化库。在
应用程序
类中,将其添加到
onCreate()

要设置日期格式,您可以继续上面的“结果”:

有很多DateTimeFormatter助手函数,请阅读文档,它很容易使用

其中之一是模式(…)的


天空,是极限

帮自己一个忙,使用
java.time.*
而不是
Date
/
SimpleDateFormat

如果您不能使用API 26/Gradle 4.x或更高版本(因此可以访问Java 8),那么在您可以使用之前,您可以通过Jake Wharton的改编在Android上使用:

要转换自历元以来的一个瞬间,请执行以下操作:

    val instant = Instant.ofEpochMilli(milliseconds)

    val result = instant.atOffset(ZoneOffset.UTC).toLocalDateTime() //for example
有很多方法可以利用

不要忘记为要加载的时区数据库初始化库。在
应用程序
类中,将其添加到
onCreate()

要设置日期格式,您可以继续上面的“结果”:

有很多DateTimeFormatter助手函数,请阅读文档,它很容易使用

其中之一是模式(…)的


天空,是极限

您没有在
SimpleDataFormat
上设置时区,因此您将获得JVM的默认时区:

dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

您没有在
SimpleDataFormat
上设置时区,因此您将获得JVM的默认时区:

dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

您的目标是哪种API级别?无论如何,您应该使用
java.time
包中的类。然后,您可以简单地使用
Instant.ofepochssecond
来获得
Instant
,然后可以将其转换为
OffsetDateTime
,然后可以使用
DateTimeFormatter
对其进行格式化。您的目标是哪个API级别?无论如何,您应该使用
java.time
包中的类。然后,您可以简单地使用
Instant.ofepochssecond
获得
即时
,然后可以将其转换为
OffsetDateTime
,然后可以使用
DateTimeFormatter
对其进行格式化。这是一个好的、有用的答案。因为提问者得到了以秒(不是毫秒)为单位的时间戳,所以它更有用。因为提问者有一个以秒(不是毫秒)为单位的时间戳,所以它更有用。嘿,这确实有效,谢谢你的演示。我像你一样手动设置时区,效果很好。还有一个问题。我可以从世界各地的许多城市获取天气数据,这个api提供了一个时区偏移量,以秒为单位,可以是负的,也可以是正的。这是否意味着我可以采用UTC时间,并加上偏移秒数*1000以获得该城市的当地时间?i、 我的位置落后4小时,api给我-14400秒。我能做什么(时间戳*1000L+偏移量\u秒*1000L)?嘿,这确实有效,谢谢你的演示。我像你一样手动设置时区,效果很好。还有一个问题。我可以从世界各地的许多城市获取天气数据,这个api提供了一个时区偏移量,以秒为单位,可以是负的,也可以是正的。这是否意味着我可以采用UTC时间,并加上偏移秒数*1000以获得该城市的当地时间?i、 我的位置落后4小时,api给我-14400秒。我能做什么(时间戳*1000L+偏移量\u秒*1000L)?
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));