在Android中生成两个日期之间的日期
Posted
技术标签:
【中文标题】在Android中生成两个日期之间的日期【英文标题】:generate dates between two date in Android 【发布时间】:2012-07-09 21:27:24 【问题描述】:如何在 android 中获取两个日期之间的所有日期。
例如。我有两个字符串。
String first="2012-07-15";
String second="2012-07-21";
我从这些字符串中转换并获取日期。
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
DateFormat df2 = new SimpleDateFormat("MMM dd");
String mydate = df2.format(df1.parse(first));
这样我可以从第一个和第二个字符串中获取日期。
现在我还显示这两个日期之间的所有日期。
【问题讨论】:
How can I increment a date by one day in Java? 的可能重复项 - 您可以在循环中运行增量以创建日期系列。 可能在 Android 中尚不可用,但在常规 Java 中使用LocalDate::datesUntil
: LocalDate.parse( "2012-07-15" ).datesUntil( "2012-07-21" )
会产生 Stream<LocalDate>
。
对于该问题的新读者,我建议您不要使用SimpleDateFormat
和Date
。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time API 的LocalDate
和DateTimeFormatter
。
【参考方案1】:
最好不要在日期计算中使用任何硬编码值。我们可以依靠javaCalendar
类方法来完成这个任务
查看代码
private static List<Date> getDates(String dateString1, String dateString2)
ArrayList<Date> dates = new ArrayList<Date>();
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = null;
Date date2 = null;
try
date1 = df1 .parse(dateString1);
date2 = df1 .parse(dateString2);
catch (ParseException e)
e.printStackTrace();
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date1);
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date2);
while(!cal1.after(cal2))
dates.add(cal1.getTime());
cal1.add(Calendar.DATE, 1);
return dates;
并如下使用它
List<Date> dates = getDates("2012-02-01", "2012-03-01");
for(Date date:dates)
System.out.println(date);
【讨论】:
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
这一行对我来说是不兼容的类型。当我将其更改为 SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
时,它对我有用
@AkhilaMadari 你必须使用 java.text.DateFormat
和 java.text.SimpleDateFormat
类。请检查您是否从正确的包中导入了类。
完美解决方案【参考方案2】:
public class DummyWorks extends Activity
static final long ONE_DAY = 24 * 60 * 60 * 1000L;
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getDatesBetween("03/23/2011","03/28/2011");
public static void getDatesBetween(String startDate,String endDate)
long from=Date.parse(startDate);
long to=Date.parse(endDate);
int x=0;
while(from <= to)
x=x+1;
System.out.println ("Dates : "+new Date(from));
from += ONE_DAY;
System.out.println ("No of Dates :"+ x);
【讨论】:
由于夏令时和其他奇怪的时区变化,将毫秒添加到您的日期会带来很高的失败风险。 感谢@assylias,现在我对其进行了测试。更改“long ONE_DAY”后得到正确结果 你好@Ramkiran 感谢您的回复。但我在long from = Date.parse(startDate);
遇到错误,它说 java.util.Date.parse 处的 java.illegalArgumentException。
我的日期格式是 2012-07-15。我需要用你的日期格式格式化它吗?我在这个函数中添加了什么?
是的,我认为这就是我出错的原因。 getDatesBetween() 函数有什么变化?【参考方案3】:
Kotlin 中的解决方案: 它将返回两个日期之间的日期列表。
fun getDatesBetween(dateString1:String, dateString2:String):List<String>
val dates = ArrayList<String>()
val input = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
var date1:Date? = null
var date2:Date? = null
try
date1 = input.parse(dateString1)
date2 = input.parse(dateString2)
catch (e:ParseException)
e.printStackTrace()
val cal1 = Calendar.getInstance()
cal1.time = date1
val cal2 = Calendar.getInstance()
cal2.time = date2
while (!cal1.after(cal2))
val output = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
dates.add(output.format(cal1.time))
cal1.add(Calendar.DATE, 1)
return dates
【讨论】:
【参考方案4】:java.time 脱糖
考虑使用现代 Java 日期和时间 API java.time 进行日期工作。 LocalDate
是用于日期的类(没有一天中的时间)。我假设您想要所有日期,包括给定的两个日期。
String first = "2012-07-15";
String second = "2012-07-21";
List<LocalDate> dates = LocalDate.parse(first)
.datesUntil(LocalDate.parse(second).plusDays(1))
.collect(Collectors.toList());
System.out.println(dates);
输出:
[2012-07-15, 2012-07-16, 2012-07-17, 2012-07-18, 2012-07-19, 2012-07-20, 2012-07-21]
LocalDate.datesUntil()
为我们提供了指定结束日期不包括的日期流,因此我们需要在其中添加一天才能将其包含在内。
我正在利用您的字符串是 ISO 8601 格式的事实,并且 LocalDate
将此格式解析为默认格式,也就是说,没有任何显式格式化程序。
或通过 ThreeTenABP
如果由于某种原因您使用的是 ThreeTenABP 库而不是去糖,我相信 datesUntil
方法不存在。在这种情况下,请改用循环。
List<LocalDate> dates = new ArrayList<>();
LocalDate currentDate = LocalDate.parse(first);
LocalDate lastDate = LocalDate.parse(second);
while (! currentDate.isAfter(lastDate ))
dates.add(currentDate);
currentDate = currentDate.plusDays(1);
[2012-07-15, 2012-07-16, 2012-07-17, 2012-07-18, 2012-07-19, 2012-07-20, 2012-07-21]
问题:java.time 不需要 Android API 26 级吗?
java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6。
在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。 在较旧的 Android 上,请使用脱糖或 Android 版本的 ThreeTen Backport。它被称为 ThreeTenABP。在后一种情况下,请确保使用子包从org.threeten.bp
导入日期和时间类。
链接
Oracle tutorial: Date Time 解释如何使用 java.time。 Java Specification Request (JSR) 310,其中首次描述了java.time
。
ThreeTen Backport project,java.time
的反向移植到 Java 6 和 7(JSR-310 的 ThreeTen)。
Java 8+ APIs available through desugaring
ThreeTenABP,Android 版 ThreeTen Backport
Question: How to use ThreeTenABP in Android Project,解释得很透彻。
Wikipedia article: ISO 8601
【讨论】:
【参考方案5】: val currentDateCalendar = Calendar.getInstance()
val mCurrentDate = getDateChanger(currentDateCalendar.time, "yyyy-MM-dd")
currentDateCalendar.add(Calendar.MONTH, 1)
val oneMonthNextCalendar = currentDateCalendar
val mNextDate = getDateChanger(oneMonthNextCalendar.time, "yyyy-MM-dd")
val mDates = datesBetween(
mCurrentDate,
mNextDate,
"yyyy-MM-dd"
)
for (date in mDates)
Log.i("DatesBetween",date)
@SuppressLint("SimpleDateFormat")
fun getDateChanger(mDate:Date,formatter: String): String
val dateFormat = SimpleDateFormat(formatter)
return dateFormat.format(mDate)
@SuppressLint("SimpleDateFormat")
fun datesBetween(startDate: String, endDate: String,formatter: String): List<String>
val dates = ArrayList<String>()
val dateFormat: DateFormat = SimpleDateFormat(formatter)
var sDate: Date? = null
var eDate: Date? = null
try
sDate = dateFormat.parse(startDate)
eDate = dateFormat.parse(endDate)
catch (e: ParseException)
e.printStackTrace()
val sCalendarDate = Calendar.getInstance()
sCalendarDate.time = sDate!!
val eCalendarDate = Calendar.getInstance()
eCalendarDate.time = eDate!!
while (!sCalendarDate.after(eCalendarDate))
dates.add(dateFormat.format(sCalendarDate.time))
sCalendarDate.add(Calendar.DATE, 1)
return dates
【讨论】:
以上是关于在Android中生成两个日期之间的日期的主要内容,如果未能解决你的问题,请参考以下文章