如何从时区获取时间值?

ef1yzkbh  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(295)

我想得到我传递给建设者的城市时间。如何使用时区从中获取时间,并将该时间值保存在城市类中的字符串变量time中。

package com.example.worldclocktest;

import java.io.Serializable;
import java.sql.Time;
import java.util.TimeZone;
import java.util.UUID;

public class City implements Serializable {

    private String id;
    private String name;
    private boolean important;
    private String time;

    public City(String name){
        init();
        this.name = name;
        this.important = false;

        this.time = TimeZone.getTimeZone(name);
    }
    private void init() {
        this.id = UUID.randomUUID().toString();
    }
    public String getName() {
        return name;
    }

    public void setImportant(boolean val) {
        this.important = val;
    }
    public boolean isImportant() {
        return this.important;
    }
    public String getTime()
    {
        return time;
    }

}
cpjpxq1n

cpjpxq1n1#

时区缩写与城市名称不直接匹配。请参阅tz数据库时区列表。因此,将时区与城市名称分开表示可能是明智的。
时区表示一组规则,用于确定与utc(偏移量为+00:00)的偏移量(通常以小时为单位)。由于夏时制(夏令时/冬令时),偏移量可能会随时间变化。夏时制规则也可以随着年份的变化而变化,因此您不能对某个时区在任何给定时间的偏移量进行假设。幸运的是,jvm可以为我们做到这一点:

import java.time.OffsetDateTime;
import java.time.ZoneId;

public class City {

    private String name;
    private ZoneId zoneId;

    public City(String name, String timeZone) {
        this.name = name;
        zoneId = ZoneId.of(timeZone);
    }

    public String getTime() {
        return String.format("It's %s in %s", OffsetDateTime.now(zoneId), name);
    }

    public static void main(String args[]) {
        City suva = new City("Suva", "Pacific/Fiji");
        System.out.println(suva.getTime());
    }
}

输出:

It's 2021-04-22T08:29:03.095+12:00 in Suva

如果提供无法识别的时区名称,则会引发异常:

City rebelBase = new City("Rebel base", "Hoth");
System.out.println(rebelBase.getTime());

输出:

Exception in thread "main" java.time.zone.ZoneRulesException: Unknown time-zone ID: Hoth
    at java.time.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:272)
    at java.time.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:227)
    at java.time.ZoneRegion.ofId(ZoneRegion.java:120)
    at java.time.ZoneId.of(ZoneId.java:411)
    at java.time.ZoneId.of(ZoneId.java:359)
laawzig2

laawzig22#

如果要获取当前时间,可以使用以下结构:

TimeZone timeZone = TimeZone.getTimeZone(name); // 4exmpl: "Europe/Madrid"
    ZonedDateTime zdt = ZonedDateTime.now(timeZone.toZoneId());
    this.time = zdt; // result like: 2021-04-21T21:54:35.785186+02:00[Europe/Madrid]

//对于时间,可以使用datetimeformatter,例如iso\u local\u time:this.time=zdt.format(datetimeformatter.iso\u local\u time)//结果:21:54:35.785
重要事项:时区字符串值(示例中的城市名称)必须包含一个预定义值(区域/预定义城市名称)

相关问题