如何将typescript日期转换为java日期

z3yyvxxp  于 2021-06-27  发布在  Java
关注(0)|答案(3)|浏览(326)

我有一个spring应用程序,我从angular客户端收到一个日期作为字符串,如何将此日期转换为java日期,以下是typescript日期格式:
typescript日期格式: Mon Jan 04 2021 00:00:00 GMT+0100 (Central European Standard Time) java日期格式: Mon Jan 04 00:00:00 CET 2021

zbwhf8kr

zbwhf8kr1#

Mon Jan 04 2021 00:00:00 GMT+0100 (Central European Standard Time) 这是一个不明确的时间戳。政治实体和整个世界可以自由地重新定义cest的含义,此时gmt+0100意味着一件事,cst意味着另一件事。此外,cest对这一天所做的任何与gmt+0100不同的“计算”都有影响。
例如,如果我想知道6个月后的日期,那么如果cst领先,你会想: Thu Jul 04 2021 00:00:00 GMT+0200 (Central European Daylight Time) 或者你可能希望时间早一个小时-另一个开放的问题,没有明确的答案,这个问题固有的想法'增加6个月的时间戳',所以你必须指定它,因为否则你会得到一些随机猜测的系统,你几乎不想让你的计算机/编程语言去猜测这样一个50/50的概念。
如果gmt+0100领先,您将得到: Thu Jul 04 2021 00:00:00 GMT+0100 (Central European Standard Time) 这是完全奇怪的,在整个地球上,没有任何地方的时间戳是有意义的印刷:没有人在7月4日的cest上,任何地方。这是一个“真实”的时间戳,但却被0个人使用。
因此,在继续之前,首先你需要问问你自己,当你转换它的时候,你想要保留哪些位和bob。请注意,有3种不同的时间观念:
“太阳光”时间:自新纪元以来通常以毫秒为单位测量。这是没有人类的概念,如时区。记录事件发生或将要发生的确切时间,如果事件不是人类约定的(即,当太阳光被预测发生或确实发生时,因此命名为“太阳光时间”)。在java中,最好用 java.time.Instant .
“约会”时间:通常用一大袋数字来衡量:年、月、日、时、分、秒和时区。而不是其中一个 GMT+0100 没用的区域,但是 Europe/Amsterdam . 像这样的 Central European Standard Time 有点普遍,但也是个很坏的主意。这些名字没有明确的含义,比如 Europe/Amsterdam 很可能总是有明确的含义,这是一个合适的区域。这个想法是:假设你和你的牙医预约,下个月在阿姆斯特丹。这看起来确实像是一个类似于solarflares的交易,但事实并非如此:如果荷兰决定加入一个不同的时区,在你的约会发生变化之前的绝对秒数。然而,太阳风暴不会仅仅因为某个政治实体的命令而提前一小时发生。
“警报”时间:类似于预约时间,但没有区域信息作为基本信息。如果你把闹钟设置为早上8点叫醒你,然后你跳上飞机向西飞了一大圈,你希望闹钟仍然在当地时间早上8点响:闹钟响之前的秒数应该随着你穿越区域而改变。
那么,你的时间价值打算代表什么呢?

如果是太阳光时间。

接下来的工作是首先将其转换为 java.time.Instant 反对,从那里开始。例如,通过转换回预约时间 .atZone() ,然后使用 java.time.format.DateTimeFormatter . 假设输入是在新加坡时间,那么这个策略的输出仍然是在cet。另外,我觉得您显示字符串并不是因为您需要将字符串格式化为那样的格式,而是因为您错误地认为java以这种字符串格式存储时间。它没有;java将约会时间存储为一个对象,其中包含一个年、月、日等字段。将其打印到字符串是分开的,并由格式化程序控制。你可以做一个格式化程序来打印它任何你喜欢的方式。
将此解析为 j.t.Instant 值可以根据 GMT+0100 ,可以忽略cest尾部文本。

如果是“约会”时间。

然后你需要把它解析出来,这是非常重要的;gmt+0100不是你想要的,那是一个合法的区域,但不是一个有用的区域(没有一个国家在经济特区使用gmt+0100)。地球上有些地方全年都是gmt+0100。然而,它们并不在中欧附近。因此,除了gmt+0100(包括cest)之外,相关的位是所有的,这不是一个标准的日期格式,而且据我所知,“中欧标准时间”不是java.time可以识别的东西。您需要一个包含typescript此时可以生成的所有可能字符串的表。

如果“报警时间”

那么你就可以在期末考试结束后停止解析了 :00 把剩下的扔了。使用regexp将其剥离,然后解析为 LocalDateTime 使用 LocalDateTime.of(stringValue, formatter) 方法。很简单。

忠告

试着训练你的打字稿,把这些东西打印成别的东西。一个很好的方法是把太阳光时间和一个明确的区域结合起来(比如 Europe/Amsterdam ,不像 Central European Standard Time ). 这是更容易重新划分成3个不同的概念方式来指代时间的任何一个。

bsxbgnwa

bsxbgnwa2#

java.time文件

如何将此日期转换为java日期,以下是typescript日期格式:
typescript日期格式:
Mon Jan 04 2021 00:00:00 GMT+0100 (Central European Standard Time) java.time 为您提供 DateTimeFormatterBuilder 使用它可以定义用于解析/格式化的复杂格式,如下所示:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.TextStyle;
import java.util.HashSet;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "Mon Jan 04 2021 00:00:00 GMT+0100 (Central European Standard Time)";
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                    .parseCaseInsensitive()
                                    .appendPattern("EEE MMM dd uuuu HH:mm:ss")
                                    .appendLiteral(" ")
                                    .appendZoneRegionId()
                                    .appendOffset("+HHmm", "Z")
                                    .appendLiteral(" (")
                                    .appendZoneText(TextStyle.FULL)
                                    .appendLiteral(")")
                                    .toFormatter(Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, dtf);
        System.out.println(zdt);
    }
}

输出:

2021-01-04T00:00+01:00[Europe/Paris]

java日期格式: Mon Jan 04 00:00:00 CET 2021 date-time对象应该存储有关日期、时间、时区等的信息,而不是有关格式的信息。可以将日期时间对象格式化为 String 对象,并使用日期时间格式api选择模式。
现代日期时间类型的日期时间格式api在包中, java.time.format 例如 java.time.format.DateTimeFormatter , java.time.format.DateTimeFormatterBuilder 等。
旧日期时间类型的日期时间格式api在包中, java.text 例如 java.text.SimpleDateFormat , java.text.DateFormat 等。
下面给出了如何格式化 zdt (以上获得)转换为自定义格式:

DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z uuuu", Locale.ENGLISH);
String strDateTimeFormatted = zdt.format(dtfOutput);
System.out.println(strDateTimeFormatted);

输出:

Mon Jan 04 00:00:00 CET 2021

从trail:date-time了解现代日期时间api。
如果你想转换 zdt (以上获得)进入 java.util.Date ,您可以按如下所示进行操作:

Date date = Date.from(zdt.toInstant());
System.out.println(date);

关于遗留日期时间api的说明:
这个 java.util.Date 对象不是像现代日期时间类型那样的实时日期时间对象;相反,它表示从 Epoch of January 1, 1970 . 打印对象时 java.util.Date ,其 toString 方法返回根据此毫秒值计算的日期时间。自 java.util.Date 没有时区信息,它应用jvm的时区并显示相同的时区。如果需要在不同的时区打印日期时间,则需要将时区设置为 SimpleDateFomrat 并从中获取格式化字符串。3.api的日期时间 java.util 以及它们的格式化api, SimpleDateFormat 过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。
出于任何原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。

drkbr07n

drkbr07n3#

您可以使用epoch时间在客户机和服务器之间共享时间,它´这是一个简单的方法。
typescript时代时间管理

const epoch = new Date().getTime();
console.log(epoch);

const date = new Date(epoch);
console.log(date);

结果:

1609801111672

Date Mon Jan 04 2021 22:58:31 GMT+0000 (Western European Standard Time)

使用java.util.date进行java epoch时间管理

long epoch = new Date().getTime();  
log.debug( "Epoch: {}", epoch );

Date date = new Date(epoch);    
log.debug( "Date: {}", date );

结果

Epoch: 1609801111672

Date: 2021-01-04T22:58:31.672Z

相关问题