android 从unix时间获取当前时区的小时

bttbmeg0  于 2023-09-28  发布在  Android
关注(0)|答案(4)|浏览(166)

我试图检索一个转换的“小时”整数为用户的时区与GMT UNIX时间。我的代码在某些时候是有效的,尽管例如,当时是东海岸晚上9点,一个小时的结果是0。有人能帮忙吗?

  1. long l = Long.parseLong(oslist.get(position).get("hour"));
  2. Calendar calendar = Calendar.getInstance();
  3. calendar.setTimeInMillis(l);
  4. calendar.setTimeInMillis(l * 1000);
  5. calendar.setTimeZone(TimeZone.getDefault());
  6. int hour = calendar.get(Calendar.HOUR);
  7. Log.v("TIME:", ""+hour);
irlmq6kh

irlmq6kh1#

您不需要设置时区-它是默认的,因为它是默认的。调用setTimeInMillis两次是没有意义的。所以只要:

  1. Calendar calendar = calendar.getInstance();
  2. calendar.setTimeInMillis(unixTimestamp * 1000L);
  3. int hour = calendar.get(Calendar.HOUR);

应该没问题如果不是,那么按照其他答案的建议使用字符串表示法是没有帮助的。
如果在东海岸晚上9点时给出0,则表明默认时区不是代表东海岸的时区。我建议你先诊断一下:

  1. System.out.println(TimeZone.getDefault().getID());
  2. // Just in case the ID is misleading, what's the standard offset for this zone?
  3. System.out.println(TimeZone.getDefault().getRawOffset());
hmtdttj4

hmtdttj42#

java.time

java.util日期时间API及其相应的解析/格式化类型SimpleDateFormat已经过时并且容易出错。2014年3月,modern Date-Time API取代了这个API。从那时起,强烈建议切换到现代日期时间API java.time

java.time API方案:

您可以使用Instant#ofEpochSecond来获取与给定Unix时间戳对应的Instant。接下来,将Instant转换为所需时区的ZonedDateTime,然后您可以获得单独的时间单位(例如#21040;出了这个ZonedDateTime

  1. // e.g. a Unix timestamp representing 9:00pm on 10-Sep-2023 in New York
  2. long epochSeconds = 1694394000L;
  3. Instant instant = Instant.ofEpochSecond(epochSeconds);
  4. ZonedDateTime zdt = instant.atZone(ZoneId.of("America/New_York"));
  5. System.out.println(zdt);
  6. System.out.println(zdt.getHour());

输出:

  1. 2023-09-10T21:00-04:00[America/New_York]
  2. 21

Online Demo
从**Trail: Date Time**了解有关现代日期-时间API的更多信息

展开查看全部
disho6za

disho6za3#

另外,如果您需要时区本身,请参阅Class SimpleDateFormat。特别是zZ

czfnxgou

czfnxgou4#

试试这个:

  1. long l = Long.parseLong(oslist.get(position).get("hour"));
  2. Calendar calendar = Calendar.getInstance();
  3. calendar.setTimeInMillis(l);
  4. calendar.setTimeInMillis(l * 1000);
  5. Date date = calendar.getTime(); //current date and time in UTC
  6. SimpleDateFormat df = new SimpleDateFormat("HH"); //HH = 0-23 hours
  7. df.setTimeZone(TimeZone.getDefault()); //format in given timezone
  8. String hourStringValue = df.format(date);
  9. int hourIntValue = Integer.parseInt(hourStringValue);

相关问题