Java 正在寻找创建15分钟预约的帮助,当前硬编码为1小时

Java 正在寻找创建15分钟预约的帮助,当前硬编码为1小时,java,javafx,time,Java,Javafx,Time,第一次发布-我对java/JavaFx比较新 我正试图让我的代码在15分钟内保存。该项目有一个可观察的列表,其中包含可选择的预约时间 ApptAddController.java private final ObservableList<String> times = FXCollections.observableArrayList("8:00 AM", "9:00 AM", "10:00 AM", "11:00 AM", "12:00 PM", "1:00 PM", "2:00

第一次发布-我对java/JavaFx比较新

我正试图让我的代码在15分钟内保存。该项目有一个可观察的列表,其中包含可选择的预约时间

ApptAddController.java

private final ObservableList<String> times = FXCollections.observableArrayList("8:00 AM", "9:00 AM", "10:00 AM", "11:00 AM", "12:00 PM", "1:00 PM", "2:00 PM", "3:00 PM", "4:00 PM");
createTimeStamp方法在以下方法中硬编码为“00”:

publicstaticstringcreatetimestamp(字符串日期、字符串时间、字符串位置、布尔startMode){
字符串t=time.split(“:”[0];
int baseH=Integer.parseInt(t);
if(baseH<8){
baseH+=12;
}
如果(!startMode){
baseH+=1;
}
String-baseD=String.format(“%s%02d:%s”,日期,baseH,“00”);
DateTimeFormatter dtf=模式的DateTimeFormatter.of(“yyyy-MM-dd-kk:MM”);
LocalDateTime ldt=LocalDateTime.parse(基于,dtf);
ZoneId zid;
zid=TimeZone.getDefault().toZoneId();
ZonedDateTime zdt=ldt.atZone(zid);
ZoneDateTime utcDate=zdt.和ZoneSameinstant(ZoneId.of(“UTC”));
ldt=utcDate.toLocalDateTime();
Timestamp ts=Timestamp.valueOf(ldt);
返回ts.toString();
}
我想预约15分钟,每次递增。用户将随机选择时间(8:00、8:15、8:30、8:45)。如何让这段代码检测用户选择的内容并相应地将int放入数据库中。如果我将“00”改为“15”,它将在15天后硬编码每个应用程序


谢谢你抽出时间

如果我理解正确,您可以而且应该将
LocalTime
对象放在
ObservableList
中。而不是
字符串
对象。如果是这样的话,就这样做

对于数据库中的时间也使用SQL数据类型
time
(它们可能已经存在了,我在您的问题中没有注意到这些信息)。使用
PrepatedStatement
LocalTime
对象传递到数据库。例如:

    yourPreparedStatement.setObject(5, startLocalTime);
    yourPreparedStatement.setObject(6, endLocalTime);
对date等类似的操作,只在Java和SQL端使用适当的类型

要将结束时间计算为开始时间后15分钟:

    LocalTime endLocalTime = startLocalTime.plusMinutes(15);

我知道我没有给你完整的代码,但我希望它能让你更进一步。

我不能很好地理解你的代码。所以这里有一些一般性的建议。我应该说,事先,管理约会和日程安排是一个令人惊讶的复杂问题

您似乎专注于字符串而不是适当的数据类型,这是新程序员经常遇到的问题。学会使用智能对象,而不是哑字符串。请注意,下面显示的代码都不涉及字符串,除了向用户演示之外。值作为对象与数据库交换,不使用字符串

Java在Java.time包中提供了业界领先的日期时间类。所以使用它们<代码>本地时间表示一天中的某个时间
LocalDate
只表示一个日期,没有一天中的时间,也没有时区

对于预约时间的数据输入,您应该收集一小时一分钟。在内部使用24小时时钟对象

List< LocalTime > hourTimes = 
    List.of( 
        LocalTime.of( 8 , 0 ) ,
        LocalTime.of( 9 , 0 ) ,
        LocalTime.of( 10 , 0 ) ,
        LocalTime.of( 11 , 0 ) ,
        LocalTime.of( 12 , 0 ) ,
        LocalTime.of( 13 , 0 ) ,
        LocalTime.of( 14 , 0 ) ,
        LocalTime.of( 15 , 0 ) ,
        LocalTime.of( 16 , 0 ) 
    )
;
见类似内容

下午三点

请注意,java.time使用。因此,您可以直接从主列表中自由使用
LocalTime
对象,而无需复制,也无需担心其值会从脚下被更改。这也意味着您可以跨线程使用java.time对象,正如它们设计的那样

保留一份可能的会议记录清单

List< Integer > minutes = List.of( 0 , 15 , 30 , 45 ) ;
将一天中的时间与预期日期结合起来,以获得一个对象

将其存储在SQL标准类型的数据库列中,时间戳不带时区。(这是“没有”,而不是“有”)

通常最好在SQL中使用,而不是字符串组合

myPreparedStatement.setObject( … , localDateTime ) ;
此外,记录该约会的预期时区。Java中有一个用于此的数据类型。但不是在SQL中。因此,将区域名称记录为数据库中的文本

ZoneId z = ZoneId.of( "America/Montreal" ) ;
…
myPreparedStatement.setObject( … , z.toString() ) ;  // Record name of zone as text.
顺便说一下,不需要在记录创建或上次更新时传递。您应该将数据库配置为在服务器端自动设置这些值

将业务逻辑与用户界面分开。请注意,我上面的代码都不涉及

为约会定义一个类。此类应该只知道约会的需要,以及定义有效约会的业务规则。这个类应该对数据库和用户界面一无所知

我不明白你在使用时区时想做什么。看起来你在试图形成一个物体。这是错误的做法,原因有二。首先,该类是被java.time取代的糟糕的遗留日期时间类之一;永远不要使用它。其次,这是预约的错误方式。未来的约会应记录为两个单独的部分,(a)日期和时间,(b)时区

世界各地的政治家都表现出了频繁改变其管辖时区偏移量的倾向。他们这样做几乎没有,甚至没有,预先警告。因此,如果您将明年1月的下午3:45定为一个时间点,作为时间表上的一个特定点,该区域的挂钟时间可能会在那时更改,下午3:45变为下午3:15或4:45。想象一下,如果您的软件在区域更改其与UTC的偏移量之前的特定时刻(即下午3:45)预订了约会。保留约会的客户将在当前的挂钟时间下午3点出现,而您的预约簿软件将显示他们最早(或最晚)。为避免此问题,不要将约会安排为一个时刻,将带有时间()的日期与时区(
ZoneId
)分开

只有在制定需要特定时刻的时间表时,才能将两者结合起来(日期、时间和时区)

ZoneId z = ZoneId.of( zoneNameFromDatabase ) ;
ZonedDateTime zdt = localDateTimeFromDatabase.atZone( z ) ;
LocalTime localTime = hourTimes.get( 7 ).plusMinutes( minutes.get( 2 ) ) ;  // Adding 0, 15, 30, or 45 minutes to the on-the-hour `LocalTime` object, resulting in another `LocalTime` object. 
LocalDate localDate = LocalDate.of( 2020 , Month.JANUARY , 23 ) ;
LocalDateTime localDateTime = LocalDateTime.of( localDate , localTime ) ;
myPreparedStatement.setObject( … , localDateTime ) ;
ZoneId z = ZoneId.of( "America/Montreal" ) ;
…
myPreparedStatement.setObject( … , z.toString() ) ;  // Record name of zone as text.
ZoneId z = ZoneId.of( zoneNameFromDatabase ) ;
ZonedDateTime zdt = localDateTimeFromDatabase.atZone( z ) ;
Instant instant = zdt.toInstant() ;
OffsetDateTime odt = zdt.toOffsetDateTime() ;
myPreparedStatement.setObject( … , odt ) ;  // Record history as a moment, a specific point on the timeline.