首页 > 解决方案 > 获取当前系统 UTC 日期和时间并添加 5 秒并将其格式化为所需格式的单行

问题描述

所以我正在做一个项目,我需要这样做:

所需格式:2021-06-17T09:23:01(UTC时间)

主要是需要在Spring boot Expression中做

Expression exp = parser.parseExpression("code comes here");
System.out.println(exp.getValue());

我尝试了这么多组合,以下是一些:

Expression exp = parser.parseExpression("new java.text.SimpleDateFormat(\"yyyy-MM-dd'T'hh:mm:ss\").format(new java.util.Date().from( new java.util.Date().toInstant().plusSeconds(5)))");
Expression exp = parser.parseExpression("new java.text.DateFormat.getInstance().format(new java.util.Date().from( new java.util.Date().toInstant().plusSeconds(5)))");
Expression exp = parser.parseExpression("new java.util.Date().toInstant().plusSeconds(5)");
Expression exp = parser.parseExpression("new java.text.SimpleDateFormat(\"yyyy-MM-dd'T'hh:mm:ss\").format(new java.util.Date().toInstant().plusSeconds(5))");

我在每件事中都遇到了至少一个问题.....所以请尝试纠正它或给出正确的一个 plz

标签: javaspring-bootdateutcspring-el

解决方案


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

java.time使用现代日期时间 API 的演示:

import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        System.out.println(ZonedDateTime.now(ZoneOffset.UTC).plusSeconds(5)
                .format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss", Locale.ENGLISH)));
    }
}

输出:

2021-06-17T09:45:14

ONLINE DEMO

如果您不想使用 等静态方法ZonedDateTime.nowDateTimeFormatter.ofPattern如您所评论的那样),您可以按如下所示进行:

import java.time.ZoneOffset;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        System.out.println(new Date().toInstant().plusSeconds(5).atZone(ZoneOffset.UTC).format(
                new DateTimeFormatterBuilder().appendPattern("uuuu-MM-dd'T'HH:mm:ss").toFormatter(Locale.ENGLISH)));
    }
}

ONLINE DEMO

基于此,您可以按如下方式创建表达式:

Expression exp = parser.parseExpression("new Date().toInstant().plusSeconds(5).atZone(ZoneOffset.UTC).format(new DateTimeFormatterBuilder().appendPattern(\"uuuu-MM-dd'T'HH:mm:ss\").toFormatter(Locale.ENGLISH))");

出于任何原因,如果您需要将此对象转换Instant为 的对象java.util.Date,您可以使用Date#from

Date.from(new Date().toInstant().plusSeconds(5))

或者,

new Date(new Date().toInstant().plusSeconds(5).toEpochMilli())

但是,您需要SimpleDateFormat格式化一个对象,java.util.Date问题SimpleDateFormat是它默认使用 JVM 的时区。如果您需要特定时区的日期时间,则需要SimpleDateFormat事先明确设置时区,例如

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
String formatted = sdf.format(date); // date is an instance of java.util.Date

从Trail: Date Time了解有关现代日期时间 API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project


推荐阅读