使用日历为 2 个项目设置截止日期并验证日期?

Setting a deadline for 2 items using calendar and validate the date?

我想创建一个服务器,它应该接受 2 个输入时间(每个输入时间用于一个项目)并在项目的截止日期到达时显示。


程序应执行以下操作:

我很难用我的代码实现它。


这是我现在拥有的:

import java.io.*;
import java.net.*;
import java.util.*;

public class MultiEchoServer
{

    public static void main(String[] args) throws IOException
    {
        Calendar start = Calendar.getInstance();
        int date = start.get(Calendar.DATE);
        int month = start.get(Calendar.MONTH);
        int year = start.get(Calendar.YEAR);
        Scanner input = new Scanner(System.in);

        ServerSocket serverSocket = null;
        final int PORT = 1234;
        Socket client;
        ClientHandler handler;

        try
        {
            serverSocket = new ServerSocket(PORT);
        }
        catch (IOException ioEx)
        {
            System.out.println("\nUnable to set up port!");
            System.exit(1);
        }

        System.out.println("\nServer running...\n");

        System.out.print("Enter finishing time for item 1 in 24-hr format "); // Item 1
        System.out.print("(e.g. 17:52) :  ");
        String timeString = input.nextLine();

        String hourString = timeString.substring(0,2);
        int hour = Integer.parseInt(hourString);

        //Extract minutes from user's entry...
        String minString = timeString.substring(3,5);
        int minute = Integer.parseInt(minString);

        //Set up Calendar object to hold deadline time...
        Calendar deadline = Calendar.getInstance();

        //Put current date (retrieved from 'start' Calendar object) and time (entered by user) into above
        //Calendar object...
        deadline.set(year,month,date,hour,minute,0);
        //(Last argument above specifies seconds.)

        System.out.println("\n\nDeadline: " + getDateTime(deadline) + "\n");

        System.out.print("Enter finishing time for item 2 in 24-hr format "); // Item 2
        System.out.print("(e.g. 17:52) :  ");
        String timeString2 = input.nextLine();

        String hourString2 = timeString2.substring(0,2);
        int hour2 = Integer.parseInt(hourString2);

        //Extract minutes from user's entry...
        String minString2 = timeString2.substring(3,5);
        int minute2 = Integer.parseInt(minString2);

        //Set up Calendar object to hold deadline time...
        Calendar deadline2 = Calendar.getInstance();

        //Put current date (retrieved from 'start' Calendar object) and time (entered by user) into above
        //Calendar object...
        deadline2.set(year,month,date,hour2,minute2,0);
        //(Last argument above specifies seconds.)

        System.out.println("\n\nDeadline: " + getDateTime(deadline2) + "\n");

        //Retrieve current date and time...
        Calendar now = Calendar.getInstance();



        while(now.before(deadline) || now.before(deadline2))
        {
            //System.out.println(getDateTime(now));

            //Pause to prevent dates and times from
            //scrolling off screen too quickly...
            try
            {
                Thread.sleep(2000);
            }
            catch (InterruptedException intEx)
            {
                //Do nothing.
            }

            //Update current date and time...
            now = Calendar.getInstance();
        }

        System.out.println("\n\nDeadline reached!!!\n");

        do
        {
            //Wait for client.
            client = serverSocket.accept();

            System.out.println("\nNew client accepted.\n");
            handler = new ClientHandler(client);
            handler.start();
        }while (true);

    }

    public static String getDateTime(Calendar dateTime)
    {
        //Extract hours and minutes, each with 2 digits
        //(i.e., with leading zeroes if needed)...

        String hour2Digits = String.format("%02d", dateTime.get(Calendar.HOUR_OF_DAY));
        String min2Digits = String.format("%02d", dateTime.get(Calendar.MINUTE));

        return(dateTime.get(Calendar.DATE) 
                + "/" + (dateTime.get(Calendar.MONTH)+1) 
                + "/" + dateTime.get(Calendar.YEAR) 
                + "  "+ hour2Digits + ":" + min2Digits);
    }   
}


class ClientHandler extends Thread
{
    private Socket client;
    private Scanner input;
    private PrintWriter output;

    public ClientHandler(Socket socket) throws IOException
    {
        client = socket;

        input = new Scanner(client.getInputStream());
        output = new PrintWriter(client.getOutputStream(),true);
    }

    public void run()
    {
        String received;

        received = input.nextLine();
        while (!received.equals("QUIT"))
        {
            output.println("ECHO: " + received);
            received = input.nextLine();
        }

        try
        {
            System.out.println("Closing down connection...");
            client.close();
        }
        catch(IOException ioEx)
        {
            System.out.println("* Disconnection problem! *");
        }
    }
}

有没有更有效的方法来设置每个项目的截止日期并检查是否已达到截止日期?为 Item 创建一个 class 是个好主意吗?我将如何实施?

服务器端的设计似乎不一致。比较 Calendar 对象的逻辑理想情况下应该在 ClientHandler 线程中,而不是在 main 方法中。否则 ClientHandler 将没有任何意义(它在代码中的编写方式除了创建一个客户端套接字然后关闭它之外什么都不做)。

关于逻辑本身,如果您仅限于使用 Calendar API,那么您几乎无能为力以减少冗长。但是,您的代码在比较当前时间和截止日期时没有考虑年月日。

如果这是预期的,即服务器基本上假定截止日期在同一天,那么您不需要在创建的日历对象中设置日期。只设置小时和分钟:

deadline.set(Calendar.HOUR, hour);
deadline.set(Calendar.MINUTE, minute);

为了更精确,您可能还想包括秒数。

如果您使用的是 Java 8,那么 OffsetTime 可能会派上用场,原因如下:

  • 表示时间(无需指定日期)。
  • 它包含一个代表时区的偏移量,以防您的客户端和服务器处于不同时区。
  • 它是线程安全的。

您可以使用输入字符串创建一个对象,如下所示:

OffsetTime deadline = OffsetTime.parse("10:15:30+01:00");

并且您可以使用方法 isBefore.

与其他时间对象进行比较

如果要考虑日期的话可以用OffsetDateTime.