Android 安卓:毫秒长-精度损失一小时

Android 安卓:毫秒长-精度损失一小时,android,sharedpreferences,Android,Sharedpreferences,基本上,我有一个应用程序,它首先要求用户输入,然后当用户单击“提交”时,它会占用当前时间,并将其存储在SharedReferences中,代码如下: SubmitAction.java ConversePrefs cp = new ConversePrefs(Awake.this); Date date = new Date(System.currentTimeMillis()); cp.SetStartTime(date.getTime()); ConversePrefs.java: pu

基本上,我有一个应用程序,它首先要求用户输入,然后当用户单击“提交”时,它会占用当前时间,并将其存储在SharedReferences中,代码如下:

SubmitAction.java

ConversePrefs cp = new ConversePrefs(Awake.this);
Date date = new Date(System.currentTimeMillis());
cp.SetStartTime(date.getTime());
ConversePrefs.java:

 public void SetStartTime(long start){
     SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
     SharedPreferences.Editor editor = settings.edit();  
     editor.putLong("StartTime", start);
     editor.commit();
 }
 public long GetStartTime(){
     SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
     long setting  = settings.getLong("StartTime", 0);
     return setting;
     }
完成应用程序的所有操作和功能后,用户将进入新的活动,该活动获取开始时间并使用当前时间

FinalActivity.java:

    final ConversePrefs cp = new ConversePrefs(this);
    final long start_time = cp.GetStartTime();
    final SimpleDateFormat formatter = new SimpleDateFormat("hh:mm:ss"); 
    Date date = new Date(System.currentTimeMillis());   
    long end_time = date.getTime();
    long final_time = end_time - start_time;
    String dateString = formatter.format(new Date(final_time));
dateString最后显示偏移量为1小时。 例如:

我在凌晨2:40:22点击了提交按钮 应用程序在13秒内完成了所有操作并打开了新活动。 最后,我的柜台上写着: 时间:01:00:13

因此它增加了一个小时,这可能是什么问题/原因


顺便说一句,我现在是UTC时区。

不要使用日期格式化程序来格式化“经过的时间”。它不是为那个而设计的。您在这里实际格式化的是1970年1月某个日期的时间部分,您可能被时区或DST问题绊倒。为什么不把秒数打印成整数(或双精度)?如果您已经使用了Commons Lang,那么就有了。

关闭1小时几乎总是意味着DST问题。@Gabeschen:不过,我想不是在这里。嗯。是的,在这个问题上,你下面的答案可能是对的。@Gabeschen:再想想,也许这也是一个时区问题。为什么它会将“00”小时打印为“1”?我可以理解它变成了“12”(如“午夜”)。但即使是时区问题,它也不应该增加额外的小时,因为它对新旧时区都使用相同的时区。我的意思是,如果旧时间是在-1时区,新时间是在+0时区,那么是的,它应该增加一个小时,但这是相同的。第一个解决方案不起作用-HH格式,它仍然偏移了一个小时。好吧,那么这真的是一个时区问题。不要在这里使用DateFormatter。因此,您建议:不要使用DateFormatter-只需执行:final_time=NewTime-OldTime;差值=最终_时间/1000;这会以秒为单位给出差异,然后用如下方式格式化:小时=差异/3600分钟=(差异/60)%60秒=差异%60?是的。也许你可以从DurationFormatUtils中复制相关的方法。使用这个方法:long final\u time=end\u time-start\u time;长时间=时间单位。毫秒。到小时(最终时间);长分钟=时间单位。毫秒。至分钟(最终时间);长秒=时间单位毫秒到秒(最终时间);