我正在尝试显示两个日期之间的自定义文本结果。这是片段中的代码,该代码返回两个日期:
public class HomeFragment extends BaseFragment {
...
dashboardViewModel.productCategory.observe(this, data - > {
if (data != null && data.getData() != null) {
int totalLos = Integer.parseInt(data.getData().getLos());
Log.e("totalLOS", String.valueOf(totalLos));
explainDays(totalLos);
mBinding.los.setText("");
}
});
}
下面是BaseFragment中的代码,该代码生成两个日期:
public abstract class BaseFragment extends Fragment {
...
public void explainDays(int totalDays) {
Calendar calendar = Calendar.getInstance();
Date start = calendar.getTime();
calendar.add(Calendar.DATE, -totalDays);
Date end = calendar.getTime();
Log.e("startDate", String.valueOf(start));
Log.e("endDate", String.valueOf(end));
}
}
从上面的代码中,我得到了以下三个日志:
E/totalLOS: 1233
E/startDate: Mon Jun 08 19:45:08 GMT+07:00 2020
E/endDate: Sun Jan 22 19:45:08 GMT+07:00 2017
如何在这两个日期结果之间生成诸如自2007年以来的1年零5个月之类的响应? 自2007年以来的需要从上面的“日志”中的 endDate 中提取。
任何帮助将不胜感激。
谢谢。
答案 0 :(得分:3)
您可以执行以下操作:
import java.time.OffsetDateTime;
import java.time.Period;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// Define format
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss O yyyy");
// Date/time strings
String strEndDate = "Mon Jun 08 19:45:08 GMT+07:00 2020";
String strStartDate = "Sun Jan 22 19:45:08 GMT+07:00 2017";
// Define ZoneOffset
ZoneOffset zoneOffset = ZoneOffset.ofHours(6);
// Parse date/time strings into OffsetDateTime
OffsetDateTime startDate = OffsetDateTime.parse(strStartDate, formatter).withOffsetSameLocal(zoneOffset);
OffsetDateTime endDate = OffsetDateTime.parse(strEndDate, formatter).withOffsetSameLocal(zoneOffset);
// Calculate period between `startDate` and `endDate`
Period period = Period.between(startDate.toLocalDate(), endDate.toLocalDate());
// Display result
System.out.println(
period.getYears() + " years and " + period.getMonths() + " months since " + startDate.getYear());
}
}
输出:
3 years and 4 months since 2017
注意:不要使用过时的java.util.Date
和SimpleDateFormat
,而要使用现代的日期/时间API。选中this,以了解更多信息。
注意:以下内容已从How to get start time and end time of a day in another timezone in Android
复制而来java.time在旧的和更新的Android设备上均可正常运行。它只需要至少 Java 6 。
org.threeten.bp
导入日期和时间类。但是除了切换到ThreeTenBP之外,我们没有其他选择 图书馆?
如果您坚持,我想可以找到使用Calendar
,Date
和SimpleDateFormat
的方法。这些类的设计很差,而且已经过时,因此,根据我所知道和不知道的知识,我更喜欢ThreeTenABP。
java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。答案 1 :(得分:0)
如果您可以从两个日期中提取月,日和年,则可以使用以下解决方案计算两个日期之间的确切差值。
int sday=22 //int day of month here
int smonth=1 //int month here
int syear=2017 //int year here
int eday=5 //int day of month here
int emonth=6 //int month here
int eyear=2020 //int year here
resyear = eyear - syear;
if (emonth >= smonth) {
resmonth = emonth - smonth;
} else {
resmonth = emonth - smonth;
resmonth = 12 + resmonth;
resyear--;
}
if (eday >= sday) {
resday = eday - sday;
} else {
resday = eday - sday;
resday = 31 + resday;
if (resmonth == 0) {
resmonth = 11;
resyear--;
} else {
resmonth--;
}
}
if (resday <0 || resmonth<0 || resyear<0) {
Toast.makeText(getApplicationContext(), "starting date must greater than ending date", Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(getApplicationContext(), "difference: " + resyear + " years /" + resmonth + " months/" + resday + " days", Toast.LENGTH_LONG).show();
}
}