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

基于java中的国家代码(DE、IT、ES、IE、PT、UK)的当前日期和时间

宇文修文
2023-03-14

我的要求是根据国家代码(DE、IT、ES、IE、PT、UK)获取的当前日期和时间。是否有任何Java API可用于此?

我也尝试设置指定国家/地区的语言环境,但我得到相同的输出?

有人能告诉我,为什么我在设置地区时也会选择“亚洲/加尔各答”时区吗?

public void timezone() {

    final Locale spanishLocale = new Locale("es", "ES");
    final Locale ukLocale = new Locale("en", "UK");
    final Locale deLocale = new Locale("de", "DE");
    final Locale itLocale = new Locale("it", "IT");
    final Locale ptLocale = new Locale("pt", "PT");
    final Locale ieLocale = new Locale("es", "ES");


   final Calendar cal = Calendar.getInstance(spanishLocale);
    System.out.println("date and time in spain is " + cal.getTime());
    System.out.println(
            "date and time in uk is " + Calendar.getInstance(ukLocale).getTime() + " :: " + Calendar.getInstance(ukLocale).getTimeZone());
    System.out.println(
            "date and time in de is " + Calendar.getInstance(deLocale).getTime() + " :: " + Calendar.getInstance(deLocale).getTimeZone());
    System.out.println(
            "date and time in it is " + Calendar.getInstance(itLocale).getTime() + " :: " + Calendar.getInstance(itLocale).getTimeZone());
    System.out.println(
            "date and time in pt is " + Calendar.getInstance(ptLocale).getTime() + " :: " + Calendar.getInstance(ptLocale).getTimeZone());
    System.out.println(
            "date and time in ie is " + Calendar.getInstance(ieLocale).getTime() + " :: " + Calendar.getInstance(ieLocale).getTimeZone());

}

输出:

西班牙的日期和时间是2018年4月7日星期六20:23:52。
英国的日期和时间是2018年4月7日星期六20:23:52。:太阳。util。日历ZoneInfo[id=“亚洲/加尔各答”,偏移量=19800000,DSTSaves=0,useDaylight=false,transitions=7,lastRule=null]
de中的日期和时间为2018年4月7日星期六20:23:52 IST::sun。util。日历ZoneInfo[id=“亚洲/加尔各答”,偏移量=19800000,DSTSaves=0,useDaylight=false,transitions=7,lastRule=null]
其中的日期和时间是2018年4月7日星期六20:23:52 IST::sun。util。日历ZoneInfo[id=“亚洲/加尔各答”,偏移量=19800000,DSTSaves=0,useDaylight=false,transitions=7,lastRule=null]
pt中的日期和时间为2018年4月7日星期六20:23:52 IST::sun。util。日历ZoneInfo[id=“亚洲/加尔各答”,偏移量=19800000,DSTSAVIES=0,useDaylight=false,transitions=7,lastRule=null]
ie中的日期和时间为2018年4月7日星期六20:23:52 IST::sun。util。日历ZoneInfo[id=“亚洲/加尔各答”,偏移量=19800000,DSTSaves=0,useDaylight=false,transitions=7,lastRule=null]

共有3个答案

公西培
2023-03-14

如果你绝对需要这样做;虽然,这是错误的,因为EST和PST在美国的可能性差不多,但相隔3个小时,那么我要做的是将国家代码映射到首都,然后将城市映射到时区,这样就有了1-1映射(南非除外,南非有2个!)。别忘了夏令时也是一件事。

桓喜
2023-03-14

了解一个国家/地区使用的所有时区的一种方法是从此文件中读取:

https://github.com/eggert/tz/blob/master/zone1970.tab

你会看到有很多国家有超过1个时区。

您还可以使用另一个文件从他们的代码中获取国家名称:

https://github.com/eggert/tz/blob/master/iso3166.tab

姚实
2023-03-14
ZonedDateTime.now(                          // Capture the current moment as seen by the wall-clock time used by the people of a certain region (a time zone).
    ZoneId.of( "Europe/Paris" )             // Specify time zone by official IANA time zone name.  https://en.wikipedia.org/wiki/Tz_database
)                                           // Returns a `ZonedDateTime` object.
.withZoneSameInstant(                       // Adjust from Paris time to Auckland time, just to show that we can. Same moment, different wall-clock time.
    ZoneId.of( "Pacific/Auckland" )
)                                           // Returns a new, second `ZonedDateTime` object without changing (“mutating”) the first. Per immutable objects pattern.
.format(                                    // Generate a String representing the value of our `ZonedDateTime`.
    DateTimeFormatter.ofLocalizedDateTime(  // Let java.time automatically localize.
        FormatStyle.FULL                    // Specify the length/abbreviation of new String.
    )                                       // Returns a `DateTimeFormatter` using the JVM’s current default `Locale`. Override this default in next line.
    .withLocale( Locale.ITALIAN )           // Locale is unrelated to time zone. Wall-clock time of Auckland, presented in Italian – perfectly reasonable depending on the needs of your user.
)                                           // Returns a String object holding text that represents the value of our `ZonedDateTime` object.

domenica 2018年4月8日08:48:16 Ora standard della Nuova Zelanda

根据国家代码确定的当前日期和时间

没有可以做。

国家和时区之间没有直接联系。

地理上较大的国家通常跨越多个时区,因此每个地区的挂钟时间都接近太阳时(这意味着“中午”是太阳在头顶的时候)。今天的印度在其广阔的陆地上使用一个时区是不寻常的。

此外,一个国家内经常有使用不同时区的飞地。这通常与加入或拒绝夏令时有关。例如,在美国,亚利桑那州选择退出夏令时的愚蠢。然而,亚利桑那州是纳瓦霍民族的一部分,纳瓦霍民族确实参与夏令时。因此,无论是国家还是州/省都没有决定时区。

此外,需要考虑的不仅仅是当前与UTC的偏移量。时区是过去、现在和未来对某一地区人民使用的偏移量的变化历史。夏令时(DST)中的切换是分区中偏移量变化的常见原因之一。确定早期/晚期需要一个时区来应用这些历史调整。

所以忘掉国家吧。以大陆/地区的格式指定适当的时区名称,例如美洲/蒙特利尔、非洲/卡萨布兰卡或太平洋/奥克兰。切勿使用3-4个字母的伪时区,如EST或IST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;

您可以根据用户当前的地理位置或国家代码进行猜测,或提供一个简短列表供用户选择。请参阅本页上well的答案,其中列出了自1970年以来使用的大约350个时区及其经度/纬度和国家代码。

摘录:

…
TK  -0922-17114 Pacific/Fakaofo
TL  -0833+12535 Asia/Dili
TM  +3757+05823 Asia/Ashgabat
TN  +3648+01011 Africa/Tunis
TO  -2110-17510 Pacific/Tongatapu
TR  +4101+02858 Europe/Istanbul
…

我也尝试设置指定国家/地区的语言环境,但得到了相同的输出?

区域设置与时区无关

要本地化,请指定:

  • 用于确定字符串的长度或缩写

例如,考虑一位来自魁北克省的工程师在印度参加会议。她希望使用Asia/Kolkata时区查看会议日程,以匹配墙上时钟上看到的一天中的时间。

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt =LocalTime.of( 14 , 0 ) ;
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;  // Conference session start. 

2018-01-23T14:00 05:30[Asia/Kolkata]

但我们的工程师更喜欢用母语法语阅读文本和格式,即语言环境。加拿大法语。

Locale locale = Locale.CANADA_FRENCH;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( locale );
String output = zdt.format( f );

mardi 2018年1月23日印度标准时间14:00:00

我的要求是根据国家代码(DE、IT、ES、IE、PT、UK)获取的当前日期和时间

您可以使用不同的时区创建一个新的时区DateTime,但其中包含相同的时刻(Instant)。所以你会看到一个不同的挂钟时间,但继续引用同一时刻,时间线上的同一点。

ZoneId zMadrid = ZoneId.of( "Europe/Madrid" ) ;
ZonedDateTime zdtMadrid = zdt.withZoneSameInstant( zMadrid) ;  // Same moment, different wall-clock time.

zdtMadrid。toString():2018-01-23T09:30 01:00[欧洲/马德里]

也许可以用日语将西班牙划为区域的时刻本地化。

DateTimeFormatter fJapan = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( Locale.JAPAN );
String outputJapan = zdtMadrid.format( fJapan );  // Zone & locale are unrelated, orthogonal issues.
System.out.println(outputJapan);

所以我们得到了以日语/文化呈现的马德里时间。

2018年1月23日火曜日9时30分00秒中央标准时

一般来说,对于大多数业务逻辑、日志记录、存储和交换,都应该使用UTC值。只需从我们的ZonedDateTime中提取一个即时代码即可。即时时间和分区日期时间都表示相同的时刻,时间线上的相同点,但使用不同的挂钟时间查看。

Instant instant = zdt.toInstant() ;  // Capture current moment in UTC.

往另一个方向走:

ZonedDateTime zdt = instant.atZone( "Europe/Helsinki" ) ;  // Same simultaneous moment, different wall-clock time.

多年前,java取代了麻烦的旧日期时间类。时间类。使用ZonedDateTime代替日历。

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

对于UTC中的片刻,使用InstantInstant类表示UTC时间线上的一个时刻,分辨率为纳秒(十进制小数的九(9)位)。

Instant instant = Instant.now() ;

java。Java 8及更高版本内置了时间框架。这些类取代了麻烦的旧遗留日期时间类,如java。util。日期、日历,

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

您可以交换java。直接使用数据库创建时间对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java。sql* 类。Hibernate5

从何处获取java。时间课程?

  • Java SE 8、Java SE 9、Java SE 10、Java SE 11及更高版本—标准Java API的一部分,带有捆绑实现。
  • 大部分java。时间功能后移植到Java 6
  • 更高版本的Android(26)捆绑了java.time类的实现。
  • 对于早期的Android(

 类似资料:
  • 问题内容: 我已经进行了所有设置,将当前日期存储到Java中的变量中。我要弄清楚的是如何存储当前日期之后1年的日期。 这是我当前的日期: 因此,例如,如果今天是今天,它将存储2/18/2013。我正在尝试存储日期2/18/2014。我将如何去做呢? 问题答案: 如果您不想拖动外部库,只需使用 请注意,如果日期是,并且您添加了1年,则将获得

  • 本文向大家介绍Javascript获取当前日期的农历日期代码,包括了Javascript获取当前日期的农历日期代码的使用技巧和注意事项,需要的朋友参考一下 JavaScript代码 调用 效果: 九月十一就是当天的农历日期

  • 问题内容: 我必须有日期时间的当前年份和月份。 我用这个: 可能还有另一种方法吗? 问题答案: 采用: 我想你想要本月的第一天。

  • 当被选中的国家改变时被调用。 会向回调函数传递两个参数:被选中的国家和相关国家列表。被选中的国家指的是一个CountryObject对象,这个对象表示新的被选中的国家;相关国家列表是CountryObject对象的列表,这个列表中储存了所有与新的被选中国家相关的国家。 使用方法: // 使用onCountryPicked() API来设置回调函数 controller.onCountryPicke

  • 有没有办法在Java中找到电话号码的国家代码?如果我给9710334544,我将收到国家代码91(如果是印度)。 有什么建议吗。

  • 问题内容: 过去几个小时以来,我一直在网上搜索以获取系统时区中的日期时间。 当我使用calendar.getTimezone.getDefaultName时,它总是返回我格林尼治标准时间。(理想情况下,它应该返回我当前的时区,即IST)。我正在尝试将此字符串(“格林尼治标准时间”)“ 2014-02-14T06:04:00:00”转换为我的时区datetime。它总是在格林尼治标准时间同时返回我。