Android Date.getTime()将一天添加到原始日期

时间:2016-06-03 00:27:45

标签: java android date milliseconds android-date

所以我有一个日历,我需要设置一个特定的日期..

    Date date = TKDateUtils.parseDate("Jun 02, 2016 05:10:30 pm");

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

我将它们记录在这里以查看输出:

    Log.i("MainActivity", date.toString());
    Log.i("MainActivity", date.getTime() + "");

输出:

    06-02 20:21:29.245 1915-1915/com.cyscorpions.timekeeper I/MainActivity: Thu Jun 02 17:10:30 EDT 2016
    06-02 20:21:29.245 1915-1915/com.cyscorpions.timekeeper I/MainActivity: 1464901830000

所以我将getTime从millis转换为Date,这是输出:

enter image description here

因此Date设置为June 2, 2016 17:10:30,但getTime()设置为该日期之后的确切日期。 我在这里做错了吗?

以下是我解析日期的方法:

public static Date parseDate(@NonNull String dateString) {
    try {
        mDateFormat = new SimpleDateFormat("MMM dd, yyyy h:mm:ss a");
        return mDateFormat.parse(dateString);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

2 个答案:

答案 0 :(得分:2)

问题始终存在于Genymotion's TimeZone上。它被设置为与我的位置不同的时区。

答案 1 :(得分:1)

指定时区

两个不同的JVM,每个JVM都有自己的(不同的)当前默认时区。在解析字符串时,每个都使用自己当前的默认时区来解释输入数据的含义。

解决方案:始终指定所需/预期的时区。

JVM的当前默认时区可以通过各种方式初始化。并且当前默认时区可以在运行时中由JVM中任何应用程序的任何线程中的任何代码更改。所以永远不要依赖于这个时区的外部性。

continent/region的格式指定proper time zone name。切勿使用诸如EDTISTCST等3-4个字母的缩写。这些不是真正的时区,不是标准化的,并且不是唯一的(!)。

指定区域设置

同样适用于Locale,用于解析日期和时间的名称。月,确定逗号与期间等。 JVM的当前默认值Locale不受您的控制。因此,请始终指定适合输入数据上下文的所需/预期Locale

java.time

您正在使用旧的日期时间类,这些类已被证明设计糟糕,令人困惑且麻烦。避免它们。

{8}类内置于Java 8及更高版本中。他们的大部分功能已经被移植到Java 6& java.time项目中的7,并在ThreeTen-Backport项目中进一步适应Android。

java.time类是非常成功的Joda-Time库的继承者,这两个项目由同一个人ThreeTenABP领导。 java.time类取代了与最早版本的Java捆绑在一起的臭名昭着的旧日期时间类。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
Locale locale = Locale.CANADA_FRENCH ;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MMM dd, yyyy h:mm:ss a" );
formatter = formatter.withLocale( locale );
formatter = formatter.withZone( zoneId );

ZonedDateTime zdt = ZonedDateTime.parse( input , formatter );

我们经常希望使用UTC中的值。为此,请使用Stephen Colbourne,以UTC为时间轴,分辨率为纳秒。

Instant instant = zdt.toInstant();

转换

如果您必须使用旧类型之一,请使用添加到旧日期时间类的新方法转换为/从java.time。

java.util.Date utilDate = java.util.Date.from( instant );
java.util.Calendar utilCal = java.util.GregorianCalendar.from( zdt );