java - 获取当前系统 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
解决方案
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
如果您不想使用 等静态方法ZonedDateTime.now
(DateTimeFormatter.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)));
}
}
基于此,您可以按如下方式创建表达式:
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 desugaring和How to use ThreeTenABP in Android Project。
推荐阅读
- r - 如何摆脱多面图中的空条形图?
- mysql - 如何在 MySQL 列注释中连接字符串?
- python - Google Cloud Engine - 如何在 Python 3.7 中接收和处理电子邮件?
- java - 如何在 .jar 中包含和访问图像
- c# - 如何更改此动画过渡以自动发生?
- c# - 如何将 List 方法更改为 Array 方法?
- java - Spring Boot - 如何使用 cors 和 spring security 修复 Session bean
- ios - WebRTC iOS 13 问题与 Metal
- java - 如何在 Java 中截断部分字符串?
- amazon-web-services - 需要移动已部署的文件夹 - AWS CodeDeploy