Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Date.getTime()将原始日期增加一天_Java_Android_Date_Milliseconds_Android Date - Fatal编程技术网

Java Android Date.getTime()将原始日期增加一天

Java Android Date.getTime()将原始日期增加一天,java,android,date,milliseconds,android-date,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.

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

    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
从毫秒转换为日期,这是输出:

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

因此,
日期
设置为2016年6月2日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;
}

问题一直在Genymotion的时区上。它被设置为与我所在位置不同的时区。

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

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

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

大陆/地区
的格式指定一个。切勿使用3-4个字母的缩写,如
EDT
IST
CST
等。这些不是真正的时区,不是标准化的,也不是唯一的(!)

指定区域设置 同样的道理,用于解析日和月的名称,确定逗号和句点,等等。JVM当前默认的
语言环境
超出了您的控制范围。因此,请始终指定适合输入数据上下文的所需/预期的
语言环境

java.time 您使用的是旧的日期时间类,这些类被证明设计得很糟糕,令人困惑,而且很麻烦。避开它们

这些类内置于Java8和更高版本中。在项目中,它们的大部分功能已经被移植到Java6和Java7中,并在项目中进一步适应Android

time类是非常成功的Joda时间库的继承者,这两个项目都由同一个人领导。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中的值。为此,请使用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 );

2016年6月2日星期四17:10:30 EDT
vs
GMT
@恐怖袋熊这是8小时您正在比较EDT与GMT。而且,当您更改时区时,您还将更加抵消te值。gettime的值是一个固定的时间点,与时区无关。它既是“2016年6月2日星期四,17:10:30(格林尼治标准时间-4)”(或美国东部时间)又是“2016年6月3日星期五,05:10:30(格林尼治标准时间+8)”,因为这是同一时间。这是因为您的解析方法使用系统的时区(EDT)进行翻译。如果要在不同的位置解析同一字符串,则getTime()的值会不同,因为“05:10:30 pm”是地球上不同的瞬间。@DaleJulian不在日历上,也不在解析器上(
SimpleDataFormat
)。