2012-03-08 64 views
2

我想在Java中创建一些代码,其中某人可以确定指定的下一个周期的时间。这很难解释,所以我举个例子。假设它是3月1日(星期四),用户想知道下一个星期六5:00代码应该输出3月3日,5:00作为日期变量,如果是3月4日,程序应该输出3月10日依此类推......查找下一个星期一的Java日期6:00,例如

然而,用户可以指定他们想要的星期几。这是用一个很长的值来完成的,它可以从周四的0点以毫秒为单位来抵消一周的时间。我有困难包缠我的头,但这是我到目前为止:

public static long findNextTimeOfTheWeek(long offset) 
{ 
    return System.currentTimeMillis() - ((System.currentTimeMillis() - offset) % 604800000) + 604800000; 
} 

如果有人可以帮助,将不胜感激。如果需要更多的澄清,请问。附: 604800000是一周内的毫秒数。

+1

忙过了一个真正的答案,但[Calendar类](http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html)可能会有帮助。 – 2012-03-08 03:01:33

+1

看看[乔达时间](http://joda-time.sourceforge.net/),它会让你的生活更轻松。这看起来并不像那么困难 - 如果你有特定的问题,也许试试更多,并发布后续行动。 – 2012-03-08 03:09:02

+0

嘿,感谢您的信息。看来,即将到来的夏令时正以某种方式让我感到困扰。我不知道为什么,但是当我将系统时间更改为4月4日时,代码似乎执行得很好。无论如何,再次感谢 – PeteyPii 2012-03-08 04:08:19

回答

0

我建议你使用Calendar类,你可以很容易地操纵它,然后使用Calendar#getTime得到一个Date对象。看下面的例子,它只是做你想做的:

import java.util.Calendar; 
import java.util.Locale; 
import java.util.Scanner; 

public class Main { 

    public static int dayOfWeekIWant(final String dayOfWeekIWantString) 
      throws Exception { 

     final int dayOfWeekIWant; 

     if ("sunday".equalsIgnoreCase(dayOfWeekIWantString)) { 
      dayOfWeekIWant = Calendar.SUNDAY; 
     } else if ("monday".equalsIgnoreCase(dayOfWeekIWantString)) { 
      dayOfWeekIWant = Calendar.MONDAY; 
     } else if ("tuesday".equalsIgnoreCase(dayOfWeekIWantString)) { 
      dayOfWeekIWant = Calendar.TUESDAY; 
     } else if ("wednesday".equalsIgnoreCase(dayOfWeekIWantString)) { 
      dayOfWeekIWant = Calendar.WEDNESDAY; 
     } else if ("thursday".equalsIgnoreCase(dayOfWeekIWantString)) { 
      dayOfWeekIWant = Calendar.THURSDAY; 
     } else if ("friday".equalsIgnoreCase(dayOfWeekIWantString)) { 
      dayOfWeekIWant = Calendar.FRIDAY; 
     } else if ("saturday".equalsIgnoreCase(dayOfWeekIWantString)) { 
      dayOfWeekIWant = Calendar.SATURDAY; 
     } else { 
      throw new Exception(
        "Invalid input, it must be \"DAY_OF_WEEK HOUR\""); 
     } 

     return dayOfWeekIWant; 
    } 

    public static String getOrdinal(int cardinal) { 
     String ordinal = String.valueOf(cardinal); 

     switch ((cardinal % 10)) { 
     case 1: 
      ordinal += "st"; 
      break; 
     case 2: 
      ordinal += "nd"; 
      break; 
     case 3: 
      ordinal += "rd"; 
      break; 
     default: 
      ordinal += "th"; 
     } 

     return ordinal; 

    } 

    public static void printDate(Calendar calendar) { 
     String dayOfWeek = calendar.getDisplayName(Calendar.DAY_OF_WEEK, 
       Calendar.LONG, Locale.ENGLISH); 
     String dayOfMonth = getOrdinal(calendar.get(Calendar.DAY_OF_MONTH)); 
     int hour = calendar.get(Calendar.HOUR_OF_DAY); 
     int minute = calendar.get(Calendar.MINUTE); 
     System.out.printf("%s %s %02d:%02d", dayOfWeek, dayOfMonth, hour, minute); 
    } 

    public static void main(String[] args) { 

     Calendar calendar = Calendar.getInstance(); 
     Scanner scanner = new Scanner(System.in); 

     final int today = calendar.get(Calendar.DAY_OF_WEEK); 

     System.out.println("Please, input the day of week you want to know:"); 

     boolean inputOk = false; 

     while (!inputOk) 

      try { 
       String input = scanner.nextLine(); 
       String[] split = input.split("\\s"); 
       String dayOfWeekIWantString = split[0]; 

       String[] splitHour = split[1].split(":"); 
       int hour = Integer.parseInt(splitHour[0]); 
       int minute = Integer.parseInt(splitHour[1]); 

       int dayOfWeekIWant = dayOfWeekIWant(dayOfWeekIWantString); 

       int diff = (today >= dayOfWeekIWant) ? (7 - (today - dayOfWeekIWant)) 
         : (dayOfWeekIWant - today); 

       calendar.add(Calendar.DAY_OF_WEEK, diff); 
       calendar.set(Calendar.HOUR_OF_DAY, hour); 
       calendar.set(Calendar.MINUTE, minute); 
       calendar.set(Calendar.SECOND, 0); 
       calendar.set(Calendar.MILLISECOND, 0); 

       inputOk = true; 

      } catch (Exception e) { 

       // Using a generic exception just for explanation purpose 
       // You must create a specific Exception 
       System.out 
         .println("Invalid input, you must enter a valid input in format: \"DAY_OF_WEEK HOUR\""); 
       continue; 
      } 

     printDate(calendar); 

    } 
} 

更多信息:

0

你应该Calendar类。您指定的日期和你添加cn的几天,几个月或几年

//Here you specify the date the constructor are (year,month,day,hour_od_day,minutes) 
     Calendar calendar = new GregorianCalendar(2011, Calendar.MARCH, 1, 5, 0); 
     calendar.add(Calendar.DAY_OF_MONTH, 5); //Adds five days to the date 
     switch (calendar.get(Calendar.DAY_OF_WEEK)) { //Tells to the calendar that i want to know the day of the week 
      case Calendar.SUNDAY: 
       System.out.println("ITS SUNDAY"); 
       break; 
      case Calendar.MONDAY: 
       System.out.println("ITS MONDAY"); 
       break; 
      case Calendar.TUESDAY: 
       System.out.println("ITS TUESDAY"); 
       break; 
      case Calendar.WEDNESDAY: 
       System.out.println("ITS WEDNESDAY"); 
       break; 
      case Calendar.THURSDAY: 
       System.out.println("ITS THURSDAY"); 
       break; 
      case Calendar.FRIDAY: 
       System.out.println("ITS FRIDAY"); 
       break; 
      case Calendar.SATURDAY: 
       System.out.println("ITS SATURDAY"); 
       break; 
     } 
     Date date = calendar.getTime(); //Get the Date object 
     System.out.println("Date = " + date); //prints the date: 

结果将是: ITS SUNDAY 日期=太阳3月6 05:00:00 MST 2011

检查Calendar类: http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html

如果要格式化Date对象检查DateFormat类:http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html

4

java.time

使用java.time框架构建在Java 8

import java.time.DayOfWeek; 
import java.time.LocalDateTime; 
import static java.time.temporal.TemporalAdjusters.nextOrSame; 

LocalDateTime now = LocalDateTime.now(); // 2015-11-22T09:32:50.045 (Sunday) 
now.with(nextOrSame(DayOfWeek.MONDAY)); // 2015-11-23T09:32:50.045 (Monday) 

如果你真的即使需要一周的第二天,你的当前日期满足此约束,你可以使用

import static java.time.temporal.TemporalAdjusters.next; 

now.with(next(DayOfWeek.MONDAY)); // 2015-11-30T09:32:50.045 (Monday)