如何在Java中将CDT格式的时间戳转换为MM / DD?

How to convert Timestamp in CDT Format to MM/DD in Java?

提问人:BugEater 提问时间:6/5/2023 最后编辑:AnonymousBugEater 更新时间:6/8/2023 访问量:115

问:

我有一个cdt格式的时间戳,如下所示,我想将这个时间戳转换为Java格式。"2023-06-05T09:00:01CDT"MM/DD

我在下面尝试过: 预期输出为:6/5 但是出现解析错误。

ZonedDateTime ztime = ZonedDateTime.parse("2023-06-05T09:00:01CDT");
Date date = Date.from(Instant.from(ztime));
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.DATE);

堆栈跟踪:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2023-06-05T09:00:01CDT' could not be parsed at index 19
    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2056)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1958)
    at java.base/java.time.ZonedDateTime.parse(ZonedDateTime.java:600)
    at java.base/java.time.ZonedDateTime.parse(ZonedDateTime.java:585)
    at MyClass.main(MyClass.java:9)
java 时间 datetime-解析 zoneddatetime

评论

1赞 Gokul G.K 6/5/2023
尝试将 DateTimeFormatter 添加到代码中
0赞 Scott Hunter 6/5/2023
你能比“没有运气”更准确吗?
0赞 deHaar 6/5/2023
没有运气到底意味着什么?编译错误?程序崩溃?意外输出?
1赞 Anonymous 6/5/2023
首先:不要使用和.java.time,你所采用的现代Java日期和时间API,已经拥有了你需要的所有功能,所以既可以避免不必要的转换,又可以避免设计不佳和过时的类的麻烦。使用两个对象,一个用于解析,一个用于格式化。CalendarDateZonedDateTimeDateCalendarDateTimeFormatter
1赞 Anonymous 6/5/2023
这可能并不重要,但 CDT 是指澳大利亚中部夏令时、北美中部夏令时、古巴夏令时、查塔姆夏令时还是其他什么?不过,更重要的是,您希望月份在同一时区吗?在月底和月初,这很重要。

答:

1赞 Gokul G.K 6/5/2023 #1

试试这个代码片段,如果是解析问题,你可以添加一个 DateTimeFormatter :: 文档

    DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssz");
    ZonedDateTime time = ZonedDateTime.parse("2023-06-05T09:00:01CDT", format);
    Date date = Date.from(Instant.from(time));
    cal.setTime(date);
    Calendar cal = Calendar.getInstance();
    String date =  (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.DATE);

评论

1赞 BugEater 6/5/2023
是的,这很有帮助
3赞 deHaar 6/5/2023
这总比没有好,但仅此而已。我不会说这很有帮助,因为它混合了过时的和现代的 API,并且正在进行不必要的转换,甚至是很多转换!
1赞 Anonymous 6/5/2023
除了@deHaar所说的之外,从对象中挑选字段并记住添加 1,因为无意义的月份编号是格式化日期的糟糕方法,即使它也被用于问题中。应该使用第二个格式化程序。CalendarCalendar
2赞 Anonymous 6/5/2023
但此语句很有帮助:如果这是一个解析问题,您可以添加一个 DateTimeFormatter。文档链接是。
2赞 Aliana 6/5/2023 #2

这可能会有所帮助。

        String cdtTimestamp = "2023-06-01T15:30:00-05:00"; // Example CDT timestamp
        // Parse CDT timestamp into ZonedDateTime
        ZonedDateTime cdtDateTime = ZonedDateTime.parse(cdtTimestamp);
        // Convert to local timezone (optional)
        ZonedDateTime localDateTime = cdtDateTime.withZoneSameInstant(ZoneId.systemDefault());
        // Format the date as MM/DD
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MM/dd");
        String formattedDate = localDateTime.format(dateFormatter);
        System.out.println("Formatted date: " + formattedDate);

评论

1赞 Aliana 6/6/2023
感谢您的反馈。我很高兴有机会作为初学者做出贡献和学习。
4赞 deHaar 6/5/2023 #3

如果您只想解析包含时区(三个字母)而不是标准区域 ID 的完整表示形式,则必须为其准备格式化程序。ZonedDateTimeString

成功解析后,获取格式的最快方法是使用 的方法并定义模式以仅输出一年中的月份和月份的某一天......StringString"MM/dd"format(DateTimeFormatter)ZonedDateTime

示例代码

public static void main(String[] args) {
    // example input
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssz");
    // prepare a formatter that can actually parse the String with a time zone
    ZonedDateTime ztime = ZonedDateTime.parse("2023-06-05T09:00:01CDT", dtf);
    // print the full zoned date time
    System.out.println(ztime);
    // and print the result in a format that only considers month of year and day of month
    System.out.println(ztime.format(DateTimeFormatter.ofPattern("M/d")));
}

输出

2023-06-05T09:00:01-05:00[America/Chicago]
6/5

优势

  • 非常短的解决方案
  • 只使用一个 API,即现代 API......

评论

0赞 g00se 6/5/2023
实际上,对我来说,它输出:2023-06-05T09:00:01+08:00[亚洲/上海]
1赞 deHaar 6/5/2023
这是关于三个字母的时区的危险之处之一,它们是模棱两可的。显然,你的 jvm/machine 假设不是 ,而是任何不同的东西。可能是或......后者会解释.CDTCentral Daylight Saving TimeCuba Daylight Saving TimeChina Daylight Saving Time"Asia/Shanghai"
0赞 VGR 6/5/2023
生成月/日字符串的替代方法:不是说它一定更好,只是另一种方法。String.format("%tm/%<td", ztime)
0赞 g00se 6/5/2023
我认为 CDT 必须被丢弃,而不是处理
1赞 Anonymous 6/5/2023
@g00se 这很大程度上取决于。当然,如果我们能避免处理模棱两可的数据和错误解释的风险,那就最好了。如果可以的话,我仍然更愿意确定 CDT 的含义并据此进行处理。然后,我准备好了,有一天,企业碰巧认为他们想要UTC或其他时区的月份。如果我们选择避免使用模棱两可的时区缩写,解决方案是解析为 a 而不是 a,从而有效地丢弃信息(并交叉手指,认为它在这种特殊情况下并不重要)。LocalDateTimeZonedDateTime