考虑到本地时区,将Java中的日期转换为epochseconds

我想将日期转换为纪元范围(当天的12 AM,当天的格林尼治标准时间11.59 PM)。

  1. fromDate = 2019-10-25T00:00:00-07:00,toDate = 2019-10-25T23:59:59-07:00:想返回(1571986800,1572073199)(相当于GMT时间戳) 2019年10月25日7:00:00 AM,格林尼治标准时间2019年10月26日6:59:59 AM)
  2. fromDate = 2019-10-24T00:00:00-07:00,toDate = 2019-10-24T23:59:59-07:00:想返回(1571900400,1571986799)(相当于GMT时间戳) 2019年10月24日,格林尼治标准时间7:00:00,格林尼治标准时间2019年10月25日,6:59:59 AM)

我的尝试

fromDate = String.valueOf(formatter.parse(fromDate.substring(0,19)).toInstant().getEpochSecond());
toDate = String.valueOf(formatter.parse(toDate.substring(0,19)).toInstant().getEpochSecond());
epochDateRange.append("(").append(fromDate).append(",").append(toDate).append(")");

通过设置为其他时区进行调试时: 即       在eclipse处添加以下参数-调试配置

'-Duser.timezone=Asia/Kuala_Lumpur'
  1. 对于上述时区,10月25日返回(1571932800,1572019199),但所需结果为(1571986800,1572073199)

  2. 对于上述时区,在10月24日返回(1571846400,1571932799),但所需结果是(1571900400,1571986799)

任何帮助将不胜感激。谢谢。

guangguang198 回答:考虑到本地时区,将Java中的日期转换为epochseconds

您的问题非常令人困惑。因此,我只能猜测您正在尝试做什么。但是主要的问题可能是您误解了什么是“从时代算起”。

一方面,通常使用dozens of epoch reference个日期时间。总是说出你的意思。与Java捆绑在一起的日期时间类使用的时间是1970年1月1日UTC时间1970-01-01T00:00Z。

另一方面,您可能没有意识到从纪元计数必须如何引用偏移量或时区才能有意义。同样,在Java中,我们使用如上所述的UTC,并在标准字符串ISO 8601格式的字符串的末尾的Z中看到。

另一个问题是,您似乎想通过确定一天的最后时刻来代表一整天的开始和结束。那是有问题的。在日期时间处理中,我们通常使用半开放方法来定义时间跨度。在半开放式中,开始为包含,而结束为排他。因此,一天是从第一天开始的,一直持续到第二天的第一天,但​​不包括这一天。

OffsetDateTime start = OffsetDateTime.parse( "2019-10-25T00:00:00-07:00" );
OffsetDateTime stop = start.plusDays( 1 ) ;
  

start.toString():2019-10-25T00:00-07:00

     

stop.toString():2019-10-26T00:00-07:00

另一个问题是使用12:00:00 AM。这可能是代表午夜滚动的棘手方法。我建议您使用24时钟进行编码。因此,UTC中的日期总是从00:00:00.0开始。 (顺便说一下,不是的一天总是在某些日期的某些时区的00:00开始。)

另一个问题是您使用偏移量而不是时区。例如,如果您知道时区为America/Phoenix,则使用该时区而不是偏移量-07:00

至于您从-07:00的偏移量跳到GMT,您在那里失去了我。我不知道你的意思。但这也许会有所帮助。

如果要查看UTC中的2019-10-25T00:00:00-07:00,只需从您的Instant中提取一个OffsetDateTime。根据定义,Instant始终采用UTC。

OffsetDateTime
.parse( "2019-10-25T00:00:00-07:00" )
.toInstant()
.toString() 
  

2019-10-25T07:00:00Z

因此,您致电2019-10-25T00:00:00-07:00相当于2019年10月25日格林尼治标准时间(实际上是格林尼治标准时间(GMT)和UTC是相同的)。第一个字符串上的-07:00表示日期时间比UTC晚七个小时。因此,UTC中具有相同时间的同一日期可能无法表示相同时刻。

也许您的目标是获取某个地区的人们在一个时区看到的一天的第一时刻。

ZoneId z = ZoneId.of( "Asia/Kuala_Lumpur" ) ;
LocalDate ld = LocalDate.parse( "2019-10-25" ) ;
ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;
ZonedDateTime zdtStop = zdtStart.plusDays( 1 ) ;

在调整为UTC时看到启动和停止。

Instant utcStart = zdtStart.toInstant() ;
Instant utcStop = zdtStop.toInstant() ;

以整秒的粒度获取从1970年1月1日T00:00:00Z开始计数。

long secondsSinceEpochStart = utcStart.getEpochSecond() ;
long secondsSinceEpochStop = utcStop.getEpochSecond() ;
  

zdtStart / zdtStop:2019-10-25T00:00 + 08:00 [Asia / Kuala_Lumpur] / 2019-10-26T00:00 + 08:00 [Asia / Kuala_Lumpur]

     

utcStart / utcStop:2019-10-24T16:00:00Z / 2019-10-25T16:00:00Z

     

secondsSinceEpochStart / secondsSinceEpochStop:1571932800/1572019200

查看所有code run live at IdeOne.com。您可以在那里轻松进行分叉和实验。

顺便说一句,如果您要花大量时间跨度跟踪一对瞬间,请将 ThreeTen-Extra 库添加到您的项目中以访问类{{3} }。此类表示一对Interval对象以及许多有用的方法,例如abutscontains等。

ZonedDateTime start = LocalDate.of( 2019,Month.OCTOBER,25 ).atStartOfDay( ZoneOffset.UTC ) ;
Interval dayInUtc = Interval.of( 
    start.toInstant(),start.plusDays( 1 ).toInstant() 
) ;
String epochCounts = dayInUtc.getStart().getEpochSecond() + "/" + dayInUtc.getEnd().getEpochSecond() ;

…以及在时区:

ZonedDateTime start = LocalDate.of( 2019,25 ).atStartOfDay( ZoneId.of( "Asia/Kuala_Lumpur" ) ) ;
Interval dayInKualaLumpur = Interval.of( 
    start.toInstant(),start.plusDays( 1 ).toInstant() 
) ;
String epochCounts = dayInKualaLumpur.getStart().getEpochSecond() + "/" + dayInKualaLumpur.getEnd().getEpochSecond() ;
,

由于您的字符串包含UTC偏移量,因此您需要解析该偏移量以获取正确的时间。

    String fromDateString = "2019-10-25T00:00:00-07:00";
    long fromEpochSecond = OffsetDateTime.parse(fromDateString).toEpochSecond();
    System.out.println("fromEpochSecond: " + fromEpochSecond);

此代码段的输出为:

  

fromEpochSecond:1571986800

这是您要求的Unix时间戳(自纪元以来的秒数)。对其他字符串进行类似的操作(您希望将转换包装到实用程序方法中。)

请注意,此代码独立于任何时区。它只是信任字符串中的偏移量。

另外两个提示:

  • 我怀疑您的代码使用旧的DateFormat和/或SimpleDateFormat类。不要那样做这些课程非常麻烦且长期过时。如果需要格式化程序,请使用java.time中的现代DateTimeFormatter
  • 使用半开间隔。不要将一天的结束时间表示为23:59:59。代表一天结束的第二天 exclusive 。因此,10月25日通常会在10月26日00:00:00结束,并且总是在10月26日的第一时刻。
  • 如果您有日期和时区,请按如下所示找到一天开始时的Unix时间戳:

        ZoneId zone = ZoneId.of("Asia/Kuala_Lumpur");
        LocalDate date = LocalDate.of(2019,25);
        long startOfDayEpochSecond = date.atStartOfDay(zone).toEpochSecond();
        System.out.println("startOfDayEpochSecond: " + startOfDayEpochSecond);
    
      

    startOfDayEpochSecond:1571932800

    由于吉隆坡不在偏移时间-07:00,所以与上述时间不同。我相信是在+08:00。

本文链接:https://www.f2er.com/3140916.html

大家都在问