【问题标题】:How to get Time Slot based on 1hour interval如何根据 1 小时间隔获取时间段
【发布时间】:2020-04-23 03:10:18
【问题描述】:

我想在数组列表中存储时隙。我有开始时间和结束时间。根据开始时间,它应该创建时间段。 例如,如果开始时间是上午 9:00,结束时间是晚上 21:00,那么它应该像下面这样添加到数组列表中

上午 9:00 10:00 AM 11:00 AM 12:00 PM 下午 13:00 下午 14:00 ..... 很快 晚上 21:00

因此,一位用户预订了下午 13:00 到下午 15:00 的时段,因此其他用户不应使用该时段,而其他时段应该可用。如何将已经预订的时间与新的数组列表进行比较。

代码

    private void getStartHourArray() {

    times = new ArrayList<TimeSlot>();
    Calendar calender = Calendar.getInstance();

    calender.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));

    int ti = calender.get(Calendar.HOUR_OF_DAY);
    int minutes = calender.get(Calendar.MINUTE);

    System.out.println(minutes);

    String[] quarterHours = {
            "00",

            "30",

    };
    boolean isflag = false;


    times = new ArrayList<>();

    for (int i = 9; i < 22; i++) {

        if (ti > 8) {
            for (int j = 0; j < 2; j++) {

                if ((i == ti && minutes < Integer.parseInt(quarterHours[j])) || (i != ti) || isflag == true) {

                    isflag = true;
                    String time = i + ":" + quarterHours[j];
                    if (i < 10) {
                        time = "0" + time;
                    }
                    String hourFormat = i + ":" + quarterHours[j];
                    if (i < 12) {
                        hourFormat = time + " AM";
                    } else
                        hourFormat = time + " PM";

                    TimeSlot t = new TimeSlot();
                    t.time = hourFormat;
                    t.isAvailable = "Available";
                    times.add(t);
                }
            }
        }

    }

    if (times != null) {
        load.setVisibility(View.GONE);

    }


}

时隙模型类

public class TimeSlot {

public String time;
 public String isAvailable;
}

【问题讨论】:

  • 请添加一些代码来显示如何输入开始时间和结束时间。预订是如何完成的。提供一些最少的代码
  • @Abhimanyu 已添加代码请查看
  • 对于这种与时间无关的工作,我建议你不要依赖Calendar 类。它的设计很糟糕而且已经过时了。在任何情况下,您都不应该按照您的方式手动格式化时间字符串。而是将ThreeTenABP 添加到您的Android 项目中,以便使用现代Java 日期和时间API java.time 中的LocalTimeDateTimeFormatter。使用起来感觉好多了。
  • 这个问题似乎被问过很多次了,hereherehereherehere

标签: java android date datetime java-time


【解决方案1】:

试试这样的:

String firstDate = "26/02/2019";
String firstTime = "00:00 AM";
String secondDate = "26/02/2019";
String secondTime = "12:00 PM";

String format = "dd/MM/yyyy hh:mm a";

SimpleDateFormat sdf = new SimpleDateFormat(format);

Date dateObj1 = sdf.parse(firstDate + " " + firstTime);
Date dateObj2 = sdf.parse(secondDate + " " + secondTime);
System.out.println("Date Start: "+dateObj1);
System.out.println("Date End: "+dateObj2);

long dif = dateObj1.getTime(); 
while (dif < dateObj2.getTime()) {
    Date slot = new Date(dif);
    System.out.println("Hour Slot --->" + slot);
    dif += 3600000;
}

这将为您提供每小时的时间段,将其添加到 ArrayList 中,当任何用户选择时间时,然后将其从 ArrayList 中删除并更新到服务器,以便下次 用户尝试获取数据,但不会获得第一个选定的用户时间段。

【讨论】:

  • 非常感谢。得到想要的输出。并需要其他帮助。我会用一些代码提出一个新问题。
  • 请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API, 和它的DateTimeFormatter 中有很多更好的东西。是的,您可以在 Android 上使用它。对于较旧的 Android,请参阅 How to use ThreeTenABP in Android Project
【解决方案2】:

试试这个:

import java.time.LocalTime;
import java.util.HashMap;
import java.util.Map;

public class PlayGround {

    private Map<LocalTime, Boolean> slots = new HashMap();

    public static void main(String[] args) {
        PlayGround client = new PlayGround();
        client.initializeSlots();

        client.allocateSlots("10:00", "13:00");
        //this shouldn't be available
        client.allocateSlots("11:00", "12:00");
        //not sure if u want this to be available. since it is start when the 1st just finished. 
        client.allocateSlots("13:00", "15:00");
        client.allocateSlots("16:00", "18:00");
    }

    private void initializeSlots() {

        LocalTime time = LocalTime.of(9, 0);
        slots.put(time, true);
        for (int i = 1; i < 24; i++) {
            slots.put(time.plusHours(i), true);
        }
    }

    private void allocateSlots(String strTime, String edTime) {
        LocalTime startTime = LocalTime.parse(strTime);
        LocalTime endTime = LocalTime.parse(edTime);

        while (startTime.isBefore(endTime)) {
            //check if the time slots between start and end time are available
            if (!slots.get(startTime) || !slots.get(endTime)) {
                System.out.println("slots not available" + " start time: " + strTime + " end time: " + edTime);
                return;
            }
            startTime = startTime.plusHours(1);
            endTime = endTime.minusHours(1);
        }

        System.out.println("slots are available" + " start time: " + strTime + " end time: " + edTime);
        //then here u can mark all slots between to unavailable.
        startTime = LocalTime.parse(strTime);
        endTime = LocalTime.parse(edTime);
        while (startTime.isBefore(endTime)) {
            slots.put(startTime, false);
            slots.put(endTime, false);
            startTime = startTime.plusHours(1);
            endTime = endTime.minusHours(1);
        }
    }

}

【讨论】:

  • 看起来不错。对它的工作原理以及它如何回答问题的一些解释会很棒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 2019-01-13
  • 2021-12-21
  • 1970-01-01
  • 2015-01-16
相关资源
最近更新 更多