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

如何在特定时区(“欧洲/巴黎”)中获取UTC Instant of start Date和endDate的今天

贺俊材
2023-03-14

我想从特定时区的Java(也在UTC)获取UTC即时(因为我的数据库存储在UTC中),这是我迄今为止所尝试的:

    public static Instant getStartOfTheDayDateTime(Instant instant, String zoneId) {

        ZonedDateTime zoned = instant.atZone(ZONE_ID_TO_ZONE_MAP.get(zoneId));
        ZoneId zone = ZoneId.of(zoneId);

        return zoned.toLocalDate().atStartOfDay(zone).toInstant();
//        ZonedDateTime startOfTheDay = zoned.withHour(0)
//                .withMinute(0)
//                .withSecond(0)
//                .withNano(0);
//
//        return startOfTheDay.toInstant();
    }

    public static Instant getEndOfTheDayDateTime(Instant instant, String zoneId) {
        ZonedDateTime zoned = instant.atZone(ZONE_ID_TO_ZONE_MAP.get(zoneId));
        ZonedDateTime endOfTheDay = zoned.withHour(0)
                .withMinute(0)
                .withSecond(0)
                .withNano(0)
                .plusDays(1);
        return endOfTheDay.toInstant();

    }

每次尝试都表明:

2020-04-10 22:00:00.0(Timestamp), 2020-04-11 22:00:00.0(Timestamp)
  • 这是欧洲/巴黎地区UTC时间一天的开始/结束吗

共有3个答案

吕嘉赐
2023-03-14

这是欧洲/巴黎地区的世界协调时开始/结束时间吗?

开始新的一天。

ZoneId z = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdtStartOfDay = instant.atZone( z ).toLocalDate().atStartOfDay( z ) ; 

询问该时刻是否在该区域的DST中。

ZoneRules rules = z.getRules();
boolean isDst = rules.isDaylightSavings( zdtStartOfDay.toInstant() );

公共静态即时GetStartoftheDaydate时间(Instant Instant,String zoneId)

我建议您让调用的程序员传递一个有效的ZoneId对象,而不仅仅是一个字符串。验证其字符串输入不应该是该方法的工作。如果可以合理预期即时,那么也可以合理预期区域ID。

 public static Instant getStartOfTheDayDateTime(Instant instant, ZoneID zoneId )

公共静态即时getEndOfTheDayDateTime(Instant Instant,String zoneId){

试图确定一天的最后一刻是不可能的,因为最后一秒是无限可分的。

此外,这种定义时间跨度的方法也很尴尬。这使得对接多个跨度变得棘手。各种软件系统和协议在最后分数秒的分辨率上有所不同,使用毫秒、微秒、纳秒或其他分数。

日期时间处理的常见做法是使用半开放方法跟踪时间跨度。在半开放式中,开始是包含的,而结束是独占的。

因此,一整天从一天的第一刻开始,一直持续到第二天的第一刻,但不包括第二天的第一刻。

ZoneId z = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdtStartOfDay = instant.atZone( z ).toLocalDate().atStartOfDay( z ) ; 
ZonedDateTime zdtStartOfNextDay = instant.atZone( z ).toLocalDate().plusDays( 1 ).atStartOfDay( z ) ;

您可能希望将代码分成更多行,以便于阅读/调试。

Instant instant = Instant.now() ;  // Or passed in. 
ZoneId z = ZoneId.of( "Europe/Paris" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
LocalDate ld = zdt.toLocalDate() ;
LocalDate ldNextDay = ld.plusDays( 1 ) ;
ZonedDateTime zdtStartOfNextDay = ldNextDay.atStartOfDay( z ) ;

查看此代码在IdeOne上的实时运行。通用域名格式。例如:

System.out.println( instant ) ;             // 2020-04-13T00:15:25.235341Z
System.out.println( zdt ) ;                 // 2020-04-13T02:15:25.235341+02:00[Europe/Paris]
System.out.println( ld ) ;                  // 2020-04-13
System.out.println( ldNextDay ) ;           // 2020-04-14
System.out.println( zdtStartOfNextDay ) ;   // 2020-04-14T00:00+02:00[Europe/Paris]

如果你经常在一段时间内做这类工作,那么我建议在你的项目中添加额外的310个库。该库包括区间类,用于将时间跨度作为一对即时对象进行跟踪。

Interval interval = Interval.of( zdtStartOfDay.toInstant() , zdtStartOfNextDay.toInstant() ) ;

然后,您可以使用几种方便的比较方法,例如靠近包含包围交集重叠联合

切勿使用java。sql。时间戳类。这个类是Java最早版本附带的糟糕的日期时间类的一部分。这些类现在是遗留的,完全被现代java所取代。JSR 310中定义的时间类,内置于Java 8及更高版本中。

从JDBC 4.2开始,我们可以交换java。带有数据库的时间对象。使用getObject、setObject和updateObject。

JDBC规范奇怪地要求支持OffsetDateTime,但不支持更常用的InstantZonedDateTime。您的特定驱动程序可能支持这些其他类型。如果没有,请转换。

数据库检索。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Instant instant = odt.toInstant() ;

发送到数据库。

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
myPreparedStatement.setObject( … , odt ) ;

姜煌
2023-03-14

这是欧洲/巴黎地区的世界协调时开始/结束时间吗?

对欧洲/巴黎是夏令时。巴黎的午夜发生在UTC时间22:00。

我希望有2020-04-11 02:00:00.0(时间戳),2020-04-12 02:00:00.0(时间戳)

不对,世界协调时02:00是巴黎时间04:00。

白浩荡
2023-03-14

现在,巴黎是夏季时间:世界协调时2。巴黎比世界协调时“领先”两个小时。

所以巴黎当地时间的00:00:00是UTC的22:00:00。

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

  • > 在Google云控制台中创建新项目 在空云数据存储中创建一个新实体。当提示输入位置时,选择,根据Cloud Datastore位置表示欧洲的多个区域。 接下来,创建新的Google App Engine(standard env)应用程序并将其部署到同一个项目中。 Cloud Datastore Locations还解释说: Google Cloud Platform项目的位置设置同时适用于C

  • 问题内容: 在一个新项目中,我正在以CSV格式导入到mysql表中的数据。列之一是价格字段,该字段以欧洲格式(即,欧元)存储货币。345,83。我遇到的问题是存储此十进制分隔符。在大多数欧洲货币中,十进制分隔符为“,”,但是当我尝试在字段中插入十进制数字(例如345,83)时,出现以下错误:“行’row#的列’column_name’的数据被截断了’”。如果我使用“。” 而不是“,”可以正常工作。

  • 对于我们的俄罗斯租户,我们使用“欧洲/莫斯科”时区。但我们比正确的时间提前了一个小时。 欧洲/莫斯科是世界协调时3小时。但是,当我打印日期格式与欧洲/莫斯科时区得到1小时前的正确时间。 谢谢,西亚玛拉。

  • 问题内容: 如何通过使用PHP中的strtotime()函数获取今天,昨天和前天的12点时间戳? 12点是一个变量,可由用户更改。 问题答案:

  • 问题内容: 如何让今天的日期YYYYMMDD在火鸟,我一看下面的,但不能想出该怎么写。 问题答案: 我认为您可以: