将字符串转换为公历日历

2022-09-02 21:27:10

我有一个来自电子邮件标头的字符串,例如.我需要的是一个公历日历的实例,它将代表同一时刻。就这么简单 -- 我该怎么做?Date: Mon, 27 Oct 2008 08:33:29 -0700

对于最快的 - 这将无法正常工作:

SimpleDateFormat format = ... // whatever you want
Date date = format.parse(myString)
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date)

因为它会将时区规范化为 UTC(或本地计算机时间,具体取决于 Java 版本)。我需要的是 calendar.getTimeZone().getRawOffset() 返回 .-7 * milisInAnHour


答案 1

我建议看看Joda Time图书馆,如果这是一个选项的话。当核心平台提供类似的功能时,我通常反对使用第三方库,但我将此作为例外,因为Joda Time的作者也落后于JSR310,而Joda Time基本上最终会被整合到Java 7中。

http://joda-time.sourceforge.net/

所以无论如何,如果Joda Time是一个选项,那么这样的东西应该有效:

DateTimeFormatter formatter =
    DateTimeFormat.forPattern("your pattern").withOffsetParsed();
DateTime dateTime = formatter.parseDateTime("your input");
GregorianCalendar cal = dateTime.toGregorianCalendar();

我希望这有帮助。


答案 2

对于最快的 - 这不会正常工作...因为它会将时区规范化为 UTC(或本地计算机时间,具体取决于 Java 版本)。我需要的是 calendar.getTimeZone().getRawOffset() 返回 -7 * milisInAnHour。

从技术上讲,这确实有效,因为虽然它将返回一个时区等于当前系统时区的对象,但时间将被修改以考虑偏移量。

此代码:

String dateString = "Mon, 27 Oct 2008 08:33:29 -0700";
DateFormat df = new SimpleDateFormat("E, dd MMM yyyy hh:mm:ss Z");
Date parsed = df.parse(dateString);
System.out.println("parsed date: " + parsed);

Calendar newCalendar = Calendar.getInstance();
newCalendar.setTime(parsed);

输出:

解析日期: 星期一 十月 27 11:33:29 EDT 2008

这在技术上是正确的,因为我的系统时区是EDT / UTC减去四个小时(这比你的时间早三个小时)。如果将时间表示为自 1970 年 1 月 1 日 00:00:00 GMT(这是对象存储其日期/时间的方式)以来的毫秒数,则这些日期/时间相等,只是时区不同。Date

您的问题实际上是如何将日期/日历转换为我的时区?为此,请看一下我对上一个问题的回答 如何使用Java处理日历时区?


推荐