android-以所需的TimeZone从毫秒显示正确的时间

android-以所需的TimeZone从毫秒显示正确的时间,第1张

概述我正在开发一个从GoogleTimeZoneAPI获取数据的应用程序.简而言之,我在地球上所需的时间毫秒为单位.例如:1504760156000它显示伦敦的日期时间,即ThuSep07201709:55:56当我从UTC进入TimeZone05:00时,如果我在这些毫秒内 *** 作1504760156000,它将显示整个日期时间,如下所

我正在开发一个从Google TimeZone API获取数据的应用程序.
简而言之,我在地球上所需的时间以毫秒为单位.

例如:1504760156000它显示伦敦的日期时间,即

Thu Sep 07 2017 09:55:56

当我从UTC进入TimeZone 05:00时,如果我在这些毫秒内 *** 作1504760156000,它将显示整个日期时间,如下所示:

Thu Sep 07 2017 09:55:56 GMT+0500 (Pakistan Standard Time)

但我想展示一下:

Thu Sep 07 2017 09:55:56 GMT+0100 (British Summer Time)

问题的寓意是:我具有伦敦的正确日期和时间,但是可以显示/更改TimeZone而无需更改时间,因为根据伦敦的时间是正确的.

更新

得到一些评论后.在我的示例中,您没有让我在这里.

假设我在巴基斯坦,时间是下午1:55,所以我通过我的应用程序询问Google Api,告诉我现在伦敦几点钟了. Google Api告诉我伦敦的时间是1504760156000(9:55 AM)以毫秒为单位,如果我将这些毫秒转换为Date对象,它将打印如下:

Date date =new Date(1504760156000)

Thu Sep 07 2017 09:55:56 GMT+0500 (Pakistan Standard Time)

它将根据我的本地TimeZone *** 作它,但我想要以下结果

Thu Sep 07 2017 09:55:56 GMT+0100 (British Summer Time)

更新2

我在UTC中以秒为单位准备了时间戳,因为Google时区API需要以秒为单位的时间戳UTC

"https://maps.GoogleAPIs.com/maps/API/timezone/Json?location="+Latitude +","+Longitude+"&timestamp="+currentTimeUTCinSEOnds+"&key="API KEY"

Google Api针对伦敦用以下JsON响应我.

{    "dstOffset" : 3600,       "rawOffset" : 0,      "status" : "OK",      "timeZoneID" : "Europe/London",      "timeZonename" : "British Summer Time"}

根据文档:

Calculating the Local Time

The local time of a given location is the sum of the timestamp
parameter, and the dstOffset and rawOffset fIElds from the result.

我总结了结果时间戳记rawoffset dstoffset * 1000 =’1504760156000′(在我尝试的时候)

项目代码

Long ultimateTime=((Long.parseLong(timeObject1.getDstOffset())*1000)+(Long.parseLong(timeObject1.getRawOffset())*1000)+timestamP*1000);                    timeObject1.setTimestamp(ultimateTime);  //its Sime POJO object to save current time of querIEd Location                     Date date=new Date(ultimateTime);                    date1.setText("Date Time : "+date);

正如我所说的,我正在本地时区 *** 作结果,因此当时给我的结果如下:

Thu Sep 07 2017 09:55:56 GMT+0500 (Pakistan Standard Time)

但是我知道API给了我正确的时间.问题是UTC的本地偏移量.我只想将GMT 0500更改为GMT 0100

解决方法:

时间戳表示从纪元起经过的时间的“绝对”值.例如,您的currentTimeUTCinSeconds代表自Unix纪元以来的秒数(1970年1月1日至00:00Z,或1970年1月1日,UTC午夜). Java API通常以自纪元以​​来的毫秒数工作.

但是概念是相同的-这些值是“绝对的”:无论世界在哪里,它们对于世界上的每个人都是相同的.如果世界上不同地区(在不同时区)的2个人同时获得当前时间戳,那么他们都将获得相同的号码.

所不同的是,在不同的时区,此相同的数字表示不同的本地日期和时间.

例如,您使用的时间戳对应于UTC 2017年9月7日08:55:56,其值为1504774556(自纪元以来的秒数).该数字对应于伦敦的09:55,卡拉奇的13:55,东京的17:55等.更改此数字将更改每个人的当地时间-无需进行 *** 作.

如果要获取表示此瞬间的java.util.Date,请执行以下 *** 作:

int currentTimeUTCinSeconds = 1504774556;// cast to long to not lose precisionDate date = new Date((long) currentTimeUTCinSeconds * 1000);

该日期将保留值1504774556000(自纪元以来的毫秒数).该值对应于伦敦的09:55,卡拉奇的13:55和东京的17:55.

但是打印此日期会将其转换为您的JVM默认时区(here是有关Date :: toString()方法的行为的很好的解释).当您执行“ Date Time:”日期时,它隐式调用toString()方法,结果是将日期转换为默认时区.

如果您希望日期采用特定格式和特定​​时区,则需要一个SimpleDateFormat.仅打印日期(使用System.out.println或通过记录日期)将不起作用:您无法更改日期对象本身的格式,因为日期为has no format.

我还使用java.util.Locale来指定月份和星期几必须为英文.如果您不指定语言环境,它将使用系统默认值,并且不能保证始终使用英语(而且即使在运行时也可以更改,因此最好始终指定语言环境):

// use the same format, use English for month and day of weekSimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'Z (zzzz)", Locale.ENGliSH);// set the timezone I wantsdf.setTimeZone(TimeZone.getTimeZone("Europe/London"));// format the dateSystem.out.println(sdf.format(date));

输出将是:

Thu Sep 07 2017 09:55:56 GMT+0100 (British Summer Time)

请注意,我不需要 *** 纵时间戳记值.我不使用Google Api,但我认为它们的解释太混乱了,上面的代码以较少的复杂性实现了相同的结果.

在您的特定情况下,您可以执行以下 *** 作:

date1.setText("Date Time : "+sdf.format(date));

Java新的日期/时间API

旧的类(Date,Calendar和SimpleDateFormat)具有lots of problems和design issues,它们已被新的API取代.

在AndroID中,您可以使用ThreeTen Backport,它是Java 8的新日期/时间类的绝佳反向端口.要使其正常工作,您还需要ThreeTenABP(有关如何使用它的更多信息here).

为了从时间戳获取日期,我使用org.threeten.bp.Instant和org.threeten.bp.ZoneID将其转换为时区,从而创建了org.threeten.bp.zoneddatetime.然后,我使用org.threeten.bp.format.DateTimeFormatter对其进行格式化:

int currentTimeUTCinSeconds = 1504774556;// get the date in London from the timestampzoneddatetime z = Instant.ofEpochSecond(currentTimeUTCinSeconds).atZone(ZoneID.of("Europe/London"));// format itDateTimeFormatter fmt = DateTimeFormatter.ofPattern("EEE MMM dd yyyy HH:mm:ss 'GMT'XX (zzzz)", Locale.ENGliSH);System.out.println(fmt.format(z));

输出是相同的:

Thu Sep 07 2017 09:55:56 GMT+0100 (British Summer Time)

就您而言,请执行以下 *** 作:

date1.setText("Date Time : "+fmt.format(z));
总结

以上是内存溢出为你收集整理的android-以所需的TimeZone从毫秒显示正确的时间全部内容,希望文章能够帮你解决android-以所需的TimeZone从毫秒显示正确的时间所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1094756.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存