当前位置: 首页 > 知识库问答 >
问题:

获取一天中不同时区的星际时间和终结时间-java

酆茂才
2023-03-14

我正在尝试获取PST时区中一天的开始时间(00:00:00)和结束时间(23:59:59)。我尝试了以下代码,但由于某种原因,我只获取UTC中的开始和结束时间。我尝试将时区更改为包括“美国/Los_angeles”,但输出时间戳始终显示GMT/UTC的开始和结束时间。

我的代码:

val time_zone = ZoneId.of("America/Los_Angeles")
val today_date = LocalDate.now(time_zone).plusDays(0)
val start_time = today_date + " " + "00:00:00"
val end_time = today_date + " " + "23:59:59"

val date_format = new SimpleDateFormat("yyyy-MM-dd");
val start_millis = date_format.parse(start_time).getTime();
val end_millis = date_format.parse(end_time).getTime();

start_millis

输出:

res375: Long = 1656460799000

我这里有什么遗漏吗?我应该更新任何包吗。?

共有2个答案

田玉韵
2023-03-14

只需将此部分添加到您的代码中:

date_format.setTimeZone(TimeZone.getTimeZone("PST"));

然后它将按您的意愿工作:)

汪德明
2023-03-14

现代方法只使用java.time类。

无需使用SimpleDataFormat、Date、Calendar和其他糟糕的遗留日期时间类。如果需要,可以通过添加到旧类中的新转换方法进行来回转换。

我正在尝试获取开始时间(00:00:00)

不要假设一天从00:00开始。某些区域中的某些日期从其他时间开始,例如01:00。让java.time使用LocalDate#atStartOfDay确定一天中的第一个时刻。

一天的结束时间(23:59:59)

如果采用这种方法,你将错过一整天的最后一秒。

日期时间工作通常采用半开放式方法。在半开放式中,开始是包含的,而结束是独占的。因此,一天从一天中的第一个时刻开始,一直到第二天的第一个时刻,但不包括第二天的第一个时刻。半开放式方法巧妙地包含了一天中完整的最后一秒。

PST时区。

没有名为PST的时区这种东西。流行媒体使用这样的2-4个字母的伪区来表示关于时区的提示。但是这些伪区没有标准化,甚至不是唯一的!仅用于向人类进行本地化演示,从不用于数据存储或数据交换。

实时时区以大陆/地区命名。

也许你所说的“太平洋标准时间”是指“太平洋标准时间”,它通常表示美国/蒂华纳,或美国/洛杉矶,或美国/温哥华或其他。

或者你所说的“太平洋标准时间”是指覆盖亚洲/马尼拉时区的“菲律宾标准时间”。

捕捉在时区中看到的当前时刻。

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

提取日期。

LocalDate today = zdt.toLocalDate() ;

确定一天中的第一个时刻。

ZonedDateTime zdtStartOfDay = today.atStartOfDay( z ) ;

并确定第二天的第一个时刻。

ZonedDateTime zdtStartOfFollowingDay = today.plusDays( 1 ).atStartOfDay( z ) ;

你可能想看看时间的长短。并非所有的日子都是24小时。

Duration d = Duration.between( zdtStartOfDay , zdtStartOfFollowingDay ) ;

通过提取即时对象,将这两个时刻调整为UTC。该类表示UTC中的一个时刻。

Instant start = zdtStartOfDay.toInstant() ;
Instant end = zdtStartOfFollowingDay.toInstant() ;

对于每个,获取自1970年第一时刻的历元参考以来的毫秒数,如UTC 1970-01-01T00:00Z所示。

long startMilli = start.toEpochMilli() ;
long endMilli = end.toEpochMilli() ;

但是,我强烈建议不要以毫秒为单位跟踪时间。这种方法令人困惑,因为通常至少使用几十个历元参考点。而且长的代码不能被人类读者解读,因此错误可能会被忽视。

相反,数据存储和数据交换通常应使用标准ISO 8601格式作为文本进行。java。时间类在解析/生成文本时默认使用这些标准格式。

String startText = start.toString() ;
String endText = end.toString() ;

您可能需要将ThreeTen额外的库添加到项目中。这使您可以访问Interval类,将时间跨度表示为一对即时对象。

Interval allDayLongToday = org.threeten.extra.Interval.of( start , end ) ;

这个类提供了几个有用的方法。这些包括包含、包围、邻接、联合、交叉等等。

Instant invoiceRecorded = … some `Instant` ;
boolean invoiceRecordedToday = allDayLongToday.contains( invoiceRecorded ) ;
 类似资料:
  • 我的日期格式为:YYYY-MM-DD 所需的输出格式是:"yyyy-MM-dd'T'HH: mm: ss.SSS'Z'" 我想在美国/芝加哥时区获得ISO格式的日期,作为一天的开始时间(从上午12:00开始)和一天的结束时间(结束于晚上11:59)。 对于eg.日期: 2020-06-08(6月8日)转换后的最终输出如下: 当天开始时间为日期: 2020-06-08T05:00:00.000Z 截

  • 问题内容: 我想使用Java代码获取不同时区的本地时间。基于传递给函数的时区,我需要该时区的本地时间。如何实现呢? 问题答案:

  • 问题内容: 我有一个时间戳记,我想知道是否有办法在PST中将其舍入到一天的开始。例如,ts:对应于,但是我想将其舍入为一个映射到的时间戳。我读了time.Time文档,但没有找到解决方法。 问题答案: 执行此操作的简单方法是使用上一个创建新内容,并且仅分配年份的月份和日期。看起来像这样; 这是一个表演例子;https://play.golang.org/p/jnFuZxruKm

  • 问题内容: 我正在使用JavaScript类,并尝试使用方法获取当前日期。但显然是加载系统日期和时间。我正在从印度运行代码,但我想使用相同的方法来获取英国的日期和时间。我怎样才能做到这一点? 问题答案: 如果您知道UTC偏移量,则可以使用以下函数传递它并获取时间:

  • 1.不同时区同时执行Instant.now() 2.不同时区同时执行new Date()

  • 问题内容: 解决的问题 外部设备正在计算并发送非标准的2小时轮班时间戳,这使我非常困惑,并启动了该线程。时区 不会影响自己的时间戳 ,时区仅在以人类可读形式进行转换时适用。 我在UTC时区有时间戳记(距离unix纪元的秒数​​),没有DST(夏令时)。 我想要使​​用DST的“欧洲/布拉格”时区中的时间戳(距Unix纪元的秒数​​)。 我曾经以为unix时间戳不受时区限制,时区仅影响将时间戳转换为