日历到日期时区问题

时间:2011-05-05 16:37:26

标签: java date calendar

我有一个日期对象,使用 SimpleDateFormat(“HH:mm”)从字符串中解析。

这个日期有正确的时间,但不是正确的日期(1970年1月),所以我创建了一个带有该日期的日历。比我创建一个包含当前日期的日历,并将小时和分钟设置为上一个日历的小时和分钟。

如果我现在使用newCal.getTime()它给我正确的日期在12:00和23:59之间的时间,但如果我例如给11:00我得到23:00h的日期,我无法解释。

这里是完整的代码:

String dateString = "11:00";
//String dateString = "20:00";

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");

Date date = sdf.parse(dateString,new ParsePosition(0));

Calendar parsedCal = Calendar.getInstance();
parsedCal.setTime(date);

Calendar newCal = Calendar.getInstance();

newCal.set(Calendar.HOUR, parsedCal.get(Calendar.HOUR));
newCal.set(Calendar.MINUTE, parsedCal.get(Calendar.MINUTE));

System.out.println(newCal.getTime());

20:00我得到正确的输出11:00我得到23:00。

4 个答案:

答案 0 :(得分:4)

您正在使用Calendar.HOUR;你应该使用Calendar.HOUR_OF_DAY

答案 1 :(得分:1)

此外,

    String dateString = "11:00";
    //String dateString = "20:00";

    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");

    Date date = sdf.parse(dateString);
    Calendar parsedCal = Calendar.getInstance();
    parsedCal.setTime(date);

    Calendar newCal = Calendar.getInstance();

    newCal.set(Calendar.HOUR, parsedCal.get(Calendar.HOUR));
    newCal.set(Calendar.MINUTE, parsedCal.get(Calendar.MINUTE));
    newCal.set(Calendar.AM_PM, parsedCal.get(Calendar.AM_PM));

    System.out.println(newCal.getTime());

答案 2 :(得分:0)

我建议查看Joda-time,其中包含代表日期,时间和日期时间的类。您的代码段可以替换为:

String dateString = "11:00";
LocalTime time = new LocalTime(dateString);

System.out.println(time.toDateTimeToday());

答案 3 :(得分:0)

TL;博士

ZonedDateTime.of(
    LocalDate.now( ZoneId.of( "Pacific/Auckland" ) ) ,  // Current date in a particular time zone.
    LocalTime.parse( "23:00" ) ,                        // Specify 11 PM.
    ZoneId.of( "Pacific/Auckland" )                     // Specify a time zone as the context for this date and time. Adjustments made automatically if that date-time is not valid in that zone.
)
  

2018-01-23T23:00 + 13:00 [太平洋/奥克兰]

java.time

现代方法使用 java.time 类而不是麻烦的旧遗留日期时间类。

java.time.LocalTime

仅限某个时段,没有日期且没有时区,请使用LocalTime课程。

LocalTime lt = LocalTime.parse( "23:00" ) ;

要确定时间轴上具有该时间的特定点,请应用日期(LocalDate)和时区(ZoneId)以生成ZonedDateTime对象。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

ZoneId

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Africa/Tunis" );

使用该区域获取当前日期。

LocalDate ld = LocalDate.now( z ) ;

ZonedDateTime

联合

ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
  

zdt.toString():2018-01-23T23:00 + 01:00 [非洲/突尼斯]

请注意,对于该特定区域,您的日期和时间可能无效。 ZonedDateTime课程会自动调整。研究文档以确保您理解并同意其调整算法。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore