有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

SpringBoot我可以用Java实例化一个已经有时区的新日期吗?

我需要生成一个已经具有正确时区的new Date();,因为我需要记录服务器上接收新数据的日期和时间。(我知道您可以使用SimpleDateFormat,但它需要解析已经创建的字符串)。 我使用的是Java+springboot


共 (2) 个答案

  1. # 1 楼答案

    爪哇。时间

    java.util日期时间API及其格式化API SimpleDateFormat已经过时且容易出错。建议完全停止使用它们,并切换到modern Date-Time API*

    使用java.time的解决方案,现代日期时间API:您可以将ZonedDateTime与适用的ZoneId一起使用

    演示:

    import java.time.ZoneId;
    import java.time.ZonedDateTime;
    
    public class Main {
        public static void main(String[] args) {
            // Use the applicable ZoneId
            ZoneId zoneId = ZoneId.of("Asia/Dubai");
            ZonedDateTime now = ZonedDateTime.now(zoneId);
            System.out.println(now);
        }
    }
    

    样本运行的输出:

    2021-10-30T02:26:07.471319+04:00[Asia/Dubai]
    

    ONLINE DEMO

    Trail: Date Time了解有关现代日期时间API的更多信息。检查this answerthis answer以了解如何在JDBC中使用java.timeAPI

    关于java.util.Date:

    一个java.util.Date对象只是表示时间轴上的一个瞬间——一个包装器,用于包装自UNIX纪元(1970年1月1日,00:00:00 GMT)以来的毫秒数。因为它不保存任何时区信息,所以它的^{}函数应用JVM的时区来返回一个String格式的EEE MMM dd HH:mm:ss zzz yyyy,它是从这个值派生出来的。要以不同的格式和时区获取java.util.Date对象的String表示,您需要将SimpleDateFormat与所需的格式和适用的时区一起使用,例如

    Date date = new Date();
    
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
    
    sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
    String strDateNewYork = sdf.format(date);
    
    sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
    String strDateUtc = sdf.format(date);
    

    *如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查Java 8+ APIs available through desugaring。请注意,Android 8.0 Oreo已经提供了support for ^{}

  2. # 2 楼答案

    使用日期格式。比如

    SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date date = isoFormat.parse("2010-05-23T09:01:02");