Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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/3/android/213.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
Android/Java-计算日期差异显示不同结果_Java_Android_Date_Calendar - Fatal编程技术网

Android/Java-计算日期差异显示不同结果

Android/Java-计算日期差异显示不同结果,java,android,date,calendar,Java,Android,Date,Calendar,这是我用来计算今天和2011年6月15日之间天数差的代码 ZoneId z = ZoneId.of( "America/Montreal" ); LocalDate today = LocalDate.now( z ); 这在EclipseIDE上总是有效的,但当我在Android上实现它时,它随机显示了两个不同的结果 大多数时候显示2405,但有时显示2406 (虽然日期本不应该改变,因为现在英国是凌晨3点。) 这是System.out.println上显示的内容。 它有相同的开始日期和

这是我用来计算今天和2011年6月15日之间天数差的代码

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
这在EclipseIDE上总是有效的,但当我在Android上实现它时,它随机显示了两个不同的结果

大多数时候显示2405,但有时显示2406 (虽然日期本不应该改变,因为现在英国是凌晨3点。)

这是System.out.println上显示的内容。 它有相同的开始日期和结束日期,但这是一个随机的机会,而循环计数1额外。怎么做

这只发生在Android上。 这是显示textview如何作为小部件进行更新(如果有帮助)的代码

public long getDays(){
    Date today = new Date ( );
    Calendar cal = Calendar.getInstance (TimeZone.getTimeZone("GMT"));
    // Set as today
    cal.setTime ( today );
    System.out.println ( "Today Cal: "+cal.get ( Calendar.YEAR ) + "Y / " + ( cal.get ( Calendar.MONTH ) + 1 ) + "M / " + cal.get ( Calendar.DATE ) + " D" );
    Calendar cal2 = Calendar.getInstance (TimeZone.getTimeZone("GMT") );
   //Month has offset -1. June = 5
    cal2.set ( 2011, 5, 15 );//YY MM DD
    System.out.println ( "Start Day Cal2: "+cal2.get ( Calendar.YEAR ) + "Y / " + ( cal2.get ( Calendar.MONTH ) + 1 ) + "M / " + cal2.get ( Calendar.DATE ) + " D" );

    long count = 0;
    while ( !cal2.after ( cal ) ) {
        count++;
        //increment date
        cal2.add ( Calendar.DATE, 1 );
    }
    System.out.println ( "Ending Cal2: "+cal2.get ( Calendar.YEAR ) + "Y / " + ( cal2.get ( Calendar.MONTH ) + 1 ) + "M / " + cal2.get ( Calendar.DATE ) + " D" );

    return count;
}
@覆盖
公共void onUpdate(上下文上下文,AppWidgetManager AppWidgetManager,int[]AppWidgetId){
最终整数计数=appWidgetIds.length;
//设置日期文本
RemoteViews RemoteView=新的RemoteView(context.getPackageName(),R.layout.haruhi_小部件);
长天数=getDays();
setTextViewText(R.id.textView,days+context.getString(R.string.days));
//设置图像视图
BitmapFactory.Options=new-BitmapFactory.Options();
options.inScaled=false;
位图Bitmap=BitmapFactory.decodeResource(context.getResources(),R.drawable.haruhi1,options);
setImageViewBitmap(R.id.imageView,位图);
意向意向=新意向(上下文,HaruhiWidgetProvider.class);
setAction(AppWidgetManager.ACTION\u APPWIDGET\u UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_id,appWidgetIds);
setonClickPendingContent(R.id.imageView,getPendingSelfIntent(context,KYON_KUN_DENWA));
for(int i=0;i
tl;博士 问题 当然,这似乎是一个时区问题。我们无法确定,因为您没有向我们提供足够的信息,例如运行代码时使用的时区

更重要的是,您使用的是多年前由java.time类过时的旧日期时间类

您正在尝试使用date with time of day类处理仅日期值

解决方案 计算今天与2011年6月15日之间的天数差

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

始终明确指定所需/预期时区。省略区域意味着隐式应用JVM的当前默认时区。默认值可能因计算机而异,甚至在运行时(!)也可能有所不同。因此,您的结果可能会有所不同。相反,始终传递可选的
ZoneId
参数。这样做的另一个好处是使用更多的自文档化代码来明确您的意图

ChronoUnit.DAYS.between( 
    LocalDate.of( 2011 , Month.JUNE , 15 ) , 
    LocalDate.now( ZoneId.of( "Africa/Tunis" ) )  
)
获取2011年6月15日的日期

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
计算经过的天数

LocalDate ld = LocalDate.of( 2011 , Month.JUNE , 15 ) ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time(JSR310)类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

作为一个考虑,考虑扔掉长期过时的日历> <代码>类,并添加到Android项目中,以便使用<代码> java。时间< /> >,即现代Java日期和时间API。和你一起工作真是太好了。