我希望在两个日期之间获得工作日,返回类型应为字符串数组,其中包括工作日(''星期日","星期一" ... .etc)请你帮我解释一下这个问题。我不知道这个
根据我的问题,我希望在开始日期结束日期之间获得工作日,如下所示
SimpleDateFormat myFormat = new SimpleDateFormat("dd/MM/yyyy");
String startDate="01/07/2015";
String endDate="31/07/2015";
try {
Date sDate=myFormat.parse(startDate);
Date eDate=myFormat.parse(endDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 0 :(得分:1)
首先,尝试找出开始日期和结束日期之间的天数差异:
SELECT 'TRUNCATE TABLE ' + TABLE_SCHEMA + '.' + TABLE_NAME + '; INSERT INTO ' + TABLE_SCHEMA + '.' + TABLE_NAME +
' SELECT * FROM <TestServer>.<TestDB>.' + TABLE_SCHEMA + '.' + TABLE_NAME + ';'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
然后,您可以找到您的间隔开始的星期几:
long startTime = sDate.getTime();
long endTime = eDate.getTime();
long differenceMillis = endTime - startTime;
// divide by the number of millis per day
int differenceInDays = Math.ceil((double) differenceMillis / MILLIS_PER_DAY);
在获得一周的开始日期和日期之间的差异后,您可以循环并将相应的值添加到结果列表中:
Calendar startCal = Calendar.getInstance();
startCal.setTime(sDate);
// if you need to skip the actual start day from the interval, add a day to the calendar
int dayOfWeek = startCal.get(DAY_OF_WEEK);
这应该是您需要遵循的基本步骤。代码只是一个示例,您可以优化和调整它以使用最佳实践。
编辑:修复了for循环中的一个错误 - List<String> days = new LinkedList<>();
for (int i = 0; i < differenceInDays; i++) {
dayOfWeek++;
if (7 < dayOfWeek) {
// if we have reached the last day of the week, we reset to the first day of the week
dayOfWeek = 1;
}
switch (dayOfWeek) {
case Calendar.SATURDAY:
days.add("Saturday");
break;
// add other cases here
}
}
应该在每次迭代时加1,而不是dayOfWeek
。现在它应该工作正常。
答案 1 :(得分:0)
private void generateDays() {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
List<String> weekDays = new ArrayList<String>();
try {
Date parse = sdf.parse("01/07/2015");
Date parse2 = sdf.parse("31/07/2015");
long start = parse.getTime();
long stop = parse2.getTime();
Calendar c = Calendar.getInstance();
c.setTimeInMillis(start);
for (int i = 0; c.getTimeInMillis() <= stop; i++) {
String date = getDate(c.getTimeInMillis(), "EEEE");
weekDays.add(date);
Log.d("xxx", (i + 1) + " " + date);
c.add(Calendar.DAY_OF_MONTH, 1);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
public static String getDate(long milliSeconds, String dateFormat) {
SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(milliSeconds);
return formatter.format(calendar.getTime());
}
答案 2 :(得分:0)
使用现代java.time类来取代麻烦的旧日期时间类。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate start = LocalDate.parse( "01/07/2015" , f );
LocalDate stop = LocalDate.parse( "31/07/2015" , f );
List<LocalDate> dates = new ArrayList<>( ChronoUnit.DAYS.between( start , stop ) + 1 );
LocalDate ld = start ;
while ( ! ld.isAfter( stop ) ) {
dates.add( ld );
// Set up next loop.
ld = ld.plusDays( 1 );
}
要获取星期几名称的字符串,请使用DayOfWeek
枚举及其本地化星期几名称的功能。
…
String output = ld.getDayOfWeek().getDisplayName( TextStyle.FULL_STANDALONE , Locale.US ); // Or Locale.CANADA_FRENCH etc.
…
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date
,.Calendar
和&amp; java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。