提问人:BugEater 提问时间:6/5/2023 最后编辑:AnonymousBugEater 更新时间:6/8/2023 访问量:115
如何在Java中将CDT格式的时间戳转换为MM / DD?
How to convert Timestamp in CDT Format to MM/DD in Java?
问:
我有一个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)
答:
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,因为无意义的月份编号是格式化日期的糟糕方法,即使它也被用于问题中。应该使用第二个格式化程序。Calendar
Calendar
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 的完整表示形式,则必须为其准备格式化程序。ZonedDateTime
String
成功解析后,获取格式的最快方法是使用 的方法并定义模式以仅输出一年中的月份和月份的某一天......String
String
"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 假设不是 ,而是任何不同的东西。可能是或......后者会解释.CDT
Central Daylight Saving Time
Cuba Daylight Saving Time
China 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,从而有效地丢弃信息(并交叉手指,认为它在这种特殊情况下并不重要)。LocalDateTime
ZonedDateTime
评论
Calendar
Date
ZonedDateTime
Date
Calendar
DateTimeFormatter