【问题标题】:How to obtain a list of zoneIds for which their day start is within past 5 minutes?如何获取过去 5 分钟内开始日期的 zoneId 列表?
【发布时间】:2022-01-27 03:37:55
【问题描述】:

假设现在的服务器时间戳是 2022-01-26 16:02:00 PDT,我想返回刚刚过了午夜(天开始)的时区列表,在这种情况下,16:02 PDT 是 2 UTC 00:00 后的分钟数,因此在这种情况下返回 [UTC]。如何返回给定时间戳 T 的 zoneIds 列表(来自该集合:ZoneId.getAvailableZoneIds())?

【问题讨论】:

  • 为了清楚起见,这个问题可以使用一些重写。

标签: java timezone


【解决方案1】:

“PDT”不是real time zone。我猜你的意思是America/Los_Angeles

ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;

将您想要的时刻定义为ZonedDateTime

LocalDate ld = LocalDate.parse( "2022-01-26" ) ;
LocalTime lt = LocalTime.parse( "16:02" ) ;
ZonedDateTime target = ZonedDateTime.of( ld , lt , z ) ;

通过调用ZoneId.getAvailableZoneIds获取您的时区名称集。

Set< String > names = ZoneId.getAvailableZoneIds() ;

循环这些区域名称。为每个对象获取一个ZoneId 对象。使用该区域对象将我们的目标调整到该区域。然后确定该日期当天在该区域的第一时刻。

您的问题错误地假设一天从 00:00 开始。不对。某些区域中的某些日期从另一个时间开始,例如 01:00。让 java.time 通过调用LocalDate#atStartOfDay 来确定一天中的第一个时刻。

Duration limit = Duration.ofMinutes( 5 ) ;
List< ZoneId > hits = new ArrayList <>( names.size() ) ;
for( String name : names ) 
{
    ZoneId zoneId = ZoneId.of( name ) ;
    ZonedDateTime zdt = target.withZoneSameInstant( ZoneId ) ;
    ZonedDateTime startOfDay = zdt.toLocalDate().atStartOfDay( zoneId ); 
    Duration d = Duration.between ( startOfDay , zdt ) ;
    if( d.compareTo( limit ) <= 0 ) { hits.add( zoneId ) ; }
}
return List.of( hits ) ;

所有这些代码都是草稿,未经测试。

【讨论】:

  • zdt.toLocalDate().atZone( zoneId )。 atZone 似乎不是一个有效的函数?但我明白你的意思。我用过这样的东西nowZoned.toLocalDate().atStartOfDay(nowZoned.getZone()).toInstant()
  • @return0 是的,我打算atStartOfDay。已修复,谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 2021-09-25
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多