日期差异为0.如何(aritmethic)使用EditView(s)中的日期?

时间:2017-09-29 15:32:37

标签: java android date datediff data-conversion

我现在正在使用此代码大约12个小时,但仍然无法使其正常工作。 免责声明:我正在使用Date-not Calendar,也不是Instant-因为我正在编写API 15(我的智能手机)。

这就是我想要做的事情:

我有几个用户可以编写的EditView。实施例

EditText StartDateEditText = (EditText) findViewById(R.id.getStartDate_editText);
EditText EndDateEditText = (EditText) findViewById(R.id.getEndDate_editText);
EditText StartHourEditText = (EditText) findViewById(R.id.getStartHour_editText);

我需要恢复该信息(String)并将其转换为日期/时间。例如:

SimpleDateFormat StartFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
        String StartAssembled = StartDateToString + " " + StartTimeToString;
        Date StartMoment = null;
        try {
            StartMoment = StartFormat.parse(StartAssembled);
        } catch (ParseException e) {
            e.printStackTrace();
        }

最后,我需要找时间并显示出来:

long difference = EndMoment.getTime() - StartMoment.getTime();
long differenceSeconds = difference / 1000;
long differenceMinutes = differenceSeconds % 60;
long differenceHours = differenceSeconds % (60 * 60);
String differenceToString = "Hours: " + String.valueOf(differenceHours) +
        " Minutes: " + String.valueOf(differenceMinutes) +
        " Seconds: " + String.valueOf(differenceSeconds);
Log.v("MainActivity:", differenceToString);

现在,用户输入_ 从2009年9月29日12:01开始 结束29/09/2017 16:31

我得到......

09-29 15:23:54.213 7798-7798/com.example.android.timeismoney V/MainActivity: Hours: 0 Minutes: 0 Seconds: 0

顺便说一句:同样的详细信息来自StartJobDate - EndJobDate

但它应该记录:小时:4分钟:30秒:0

我是Java的新手,也是时间管理的新手。会给予任何帮助。有什么建议或提示可以做得更好吗?

以下,我复制并评论我的代码:

进口等:

package com.example.android.timeismoney;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

名为“cosa”的方法(英文“thing”)因为是我的游乐场。在xml按钮中从onClick调用。

public void cosa(View view) {

从这里开始,我专注于EditText(s)

    EditText StartDateEditText = (EditText) findViewById(R.id.getStartDate_editText);
    EditText EndDateEditText = (EditText) findViewById(R.id.getEndDate_editText);
    EditText StartHourEditText = (EditText) findViewById(R.id.getStartHour_editText);
    EditText StartMinuteEditText = (EditText) findViewById(R.id.getStartMinute_editText);
    EditText EndHourEditText = (EditText) findViewById(R.id.getEndHour_editText);
    EditText EndMinuteEditText = (EditText) findViewById(R.id.getEndMinute_editText);

现在我恢复了文字

String StartDateToString = StartDateEditText.getText().toString();
String StartTimeToString = StartHourEditText.getText().toString() +
               ":" + StartHourEditText.getText().toString();
String EndDateToString = EndDateEditText.getText().toString();
String EndTimeToString = EndHourEditText.getText().toString() +
               ":" + EndHourEditText.getText().toString();

这里我设置Date vars并用EditText

中的数据填充它们
SimpleDateFormat StartFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
String StartAssembled = StartDateToString + " " + StartTimeToString;
Date StartMoment = null;
try {
    StartMoment = StartFormat.parse(StartAssembled);
} catch (ParseException e) {
    e.printStackTrace();
}

SimpleDateFormat EndFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
String EndAssembled = EndDateToString + " " + EndTimeToString;
Date EndMoment = null;
try {
    EndMoment = EndFormat.parse(EndAssembled);
} catch (ParseException e) {
    e.printStackTrace();
}

现在我操作并获得毫秒。我转换它们。然后,展示它们。

    long difference = StartMoment.getTime() - EndMoment.getTime();
    long differenceSeconds = difference / 1000;
    long differenceMinutes = difference / (60 * 1000);
    long differenceHours = difference / (1000 * 60 * 60);
    String differenceToString = "Hours: " + String.valueOf(differenceHours) +
            " Minutes: " + String.valueOf(differenceMinutes) +
            " Seconds: " + String.valueOf(differenceSeconds);
    Log.v("MainActivity:cosa()", differenceToString);


}

这是我的整个MainActivity.java:https://github.com/Hinuden/ShowAndTell/commits/master/TimeIsMoney29-09-2017-MainActivity.java

这是我的整个activity_main.xml:https://github.com/Hinuden/ShowAndTell/blob/master/TimeIsMoney-29-09-2017-activity_main.xml

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我真的不知道这里发生了什么样的黑魔法。由于你们大多数人都报告说代码有效,我除了零(零)之外什么也得不到。

但是Gandalf来帮助JIWILS写道:

  

创建differenceToString时,不需要调用String.valueOf。你可以这样连接:String differenceToString =“Hours:”+ differenceHours +“Minutes:”+ differenceMinutes +“Seconds:”+ differenceSeconds; - jwils 1小时前

我改变了这个:

String differenceToString = "Hours: " + String.valueOf(differenceHours) +
            " Minutes: " + String.valueOf(differenceMinutes) +
            " Seconds: " + String.valueOf(differenceSeconds);

对此:

String differenceToString = "Hours: " + differenceHours +
                " Minutes: " + differenceMinutes +
                " Seconds: " + differenceSeconds;

完美无缺。哪里有问题?绝对不知道。但它确实有效。

另外我重写了这样的算法:

long difference = EndMoment.getTime() - StartMoment.getTime();
        long differenceHours = difference / (1000 * 60 * 60);
        long differenceMinutes = (difference % (1000 * 60 * 60)) / (1000 * 60);
        long differenceSeconds = ((difference % (1000 * 60 * 60)) % (1000 * 60)) / 1000;

现在可以很好地显示开始和结束之间的差异。

答案 1 :(得分:1)

我已经测试了您的代码并且在输出中没有得到零:

SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy HH:mm");
Date start = f.parse("29/09/2017 12:01");
Date end = f.parse("29/09/2017 16:31");
long difference = (end.getTime() - start.getTime());
// ... same code as yours

相反,我得到了这个输出:

  

小时:4分钟:270秒:16200

我没有得到零,但无论如何,你计算价值的方式存在问题。您获得的等效于秒数,而不是将其分成每个时间单位。你应该这样做:

long differenceSeconds = (end.getTime() - start.getTime()) / 1000;
long differenceHours = differenceSeconds / 3600;
// discount the total hours
differenceSeconds -= (differenceHours * 3600);
long differenceMinutes = differenceSeconds / 60;
// discount the total seconds
differenceSeconds -= (differenceMinutes * 60);

现在differenceToString的值为:

  

小时:4分钟:30秒:0

备注

  • 由于输入只有几小时和几分钟,您可以丢弃秒数(它们总是为零),因此您也可以直接从分钟开始计算。
  • 您不需要使用String.valueOf。当您将数字与String连接起来时,只需直接使用其值
  • 即可
  • 正如您从上面注意到的那样,我使用了相同的SimpleDateFormat实例,因为开始日期和结束日期具有相同的格式。

所以你的计算是这样的:

long differenceMinutes = (end.getTime() - start.getTime()) / 1000 / 60;
long differenceHours = differenceMinutes / 60;
// discount the number of hours
differenceMinutes -= (differenceHours * 60);
// seconds is always zero, because I'm not considering in the input
String differenceToString = "Hours: " + differenceHours + " Minutes: " + differenceMinutes + " Seconds: 0";

约达时间

我通常会建议ThreeTen Backport,但它仅适用于JDK 6和7,因此对于JDK 5,您可以使用Joda-Time,这是一个很棒的API来处理日期/时间。

首先使用org.joda.time.format.DateTimeFormatter和所需模式创建org.joda.time.format.DateTimeFormat。然后我将输入解析为org.joda.time.DateTime并使用org.joda.time.Period来计算日期之间的差异。

然后我可以直接使用Period或使用org.joda.time.format.PeriodFormatter格式化差异:

// parse dates
DateTimeFormatter f = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm");
DateTime start = f.parseDateTime("29/09/2017 12:01");
DateTime end = f.parseDateTime("29/09/2017 16:31");
// calculate difference
Period diff = new Period(start, end);

String differenceToString = "Hours: " + diff.getHours() + " Minutes: " + diff.getMinutes() + " Seconds: " + diff.getSeconds();
System.out.println(differenceToString);

输出将是:

  

小时:4分钟:30秒:0

我也可以使用PeriodFormatter

PeriodFormatter pf = new PeriodFormatterBuilder()
    // hours
    .appendPrefix("Hours: ").appendHours()
    // optional space (if there are more fields)
    .appendSeparatorIfFieldsBefore(" ")
    // minutes
    .appendPrefix("Minutes: ").appendMinutes()
    // optional space (if there are more fields)
    .appendSeparatorIfFieldsBefore(" ")
    // seconds
    .appendPrefix("Seconds: ").appendSeconds()
    // create formatter
    .toFormatter();
System.out.println(pf.print(diff));

不同之处在于,如果值为零,则省略秒数:

  

时间:4分钟:30