首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用"hh:mm“Java操作

使用"hh:mm“Java操作
EN

Stack Overflow用户
提问于 2016-02-19 15:36:18
回答 2查看 103关注 0票数 1

我有一个时间和分钟范围的表,"07:00“到"14:00”,还有一个获取这些值的Java Api。一开始我用的是秒(28800到50400)。

我想得到每5分钟的所有数值("07:05“、"07:10”、"07:15“、”07:20“)."08:15"..。"13:55“、"14:00")。

但我不太明白该如何干净地做这件事。

类方法(在控制台上工作得很好,但api的输出以纳米秒为单位):

代码语言:javascript
复制
@Transient
public List<LocalTime> getHorarios(){

    long initialCapacity = 0;
    List<LocalTime> times = new ArrayList<LocalTime> ( ( int ) initialCapacity );
    while (  ! nextTime.isAfter ( stop ) ) {
        times.add ( nextTime );
        nextTime = nextTime.plusMinutes ( 5 );
    }
    return times;
}

@Transient
public List<LocalTime> getHorariosLibres(List<LocalTime> horariosTomados){

    List<LocalTime> horariosLibres = getHorarios();
    horariosLibres.removeAll(horariosTomados);
    return horariosLibres;
}

到目前为止,这是我的控制器:

代码语言:javascript
复制
@RequestMapping(value = "/horario/{fecha}", method = RequestMethod.GET)
@ResponseBody
public Object queryHorariosLibres(@PathVariable("fecha") @DateTimeFormat(pattern="yyyy-MM-dd") Date fecha) {
    List<LocalTime> horariosTomados = turnoService.getHorariosTomados(fecha);
    Calendar dia = new GregorianCalendar();
    dia.setTime(fecha);
    Horario horario = horarioRepository.findByDia(dia.get(Calendar.DAY_OF_WEEK));  
    List<LocalTime> horariosLibres = horario.getHorariosLibres(horariosTomados);

    return horariosLibres;
}   

通过API实现的实际输出:

代码语言:javascript
复制
   [{"hour":7,"minute":0,"second":0,"nano":0},{"hour":7,"minute":5,"second":0,"nano":0},{"hour":7,"minute":10,"second":0,"nano":0},{"hour":7,"minute":15,"second":0,"nano":0},{"hour":7,"minute":20,"second":0,"nano":0},{"hour":7,"minute":25,"second":0,"nano":0},{"hour":7,"minute":30,"second":0,"nano":0},{"hour":7,"minute":35,"second":0,"nano":0},{"hour":7,"minute":40,"second":0,"nano":0},{"hour":7,"minute":45,"second":0,"nano":0},{"hour":7,"minute":50,"second":0,"nano":0},{"hour":7,"minute":55,"second":0,"nano":0},{"hour":8,"minute":0,"second":0,"nano":0},{"hour":8,"minute":5,"second":0,"nano":0},{"hour":8,"minute":10,"second":0,"nano":0},{"hour":8,"minute":15,"second":0,"nano":0},{"hour":8,"minute":20,"second":0,"nano":0},{"hour":8,"minute":25,"second":0,"nano":0},{"hour":8,"minute":30,"second":0,"nano":0},{"hour":8,"minute":35,"second":0,"nano":0},{"hour":8,"minute":40,"second":0,"nano":0},{"hour":8,"minute":45,"second":0,"nano":0},{"hour":8,"minute":50,"second":0,"nano":0},{"hour":8,"minute":55,"second":0,"nano":0},{"hour":9,"minute":0,"second":0,"nano":0},{"hour":9,"minute":5,"second":0,"nano":0},{"hour":9,"minute":10,"second":0,"nano":0},{"hour":9,"minute":15,"second":0,"nano":0},{"hour":9,"minute":20,"second":0,"nano":0},{"hour":9,"minute":25,"second":0,"nano":0},{"hour":9,"minute":30,"second":0,"nano":0},{"hour":9,"minute":35,"second":0,"nano":0},{"hour":9,"minute":40,"second":0,"nano":0},{"hour":9,"minute":45,"second":0,"nano":0},{"hour":9,"minute":50,"second":0,"nano":0},{"hour":9,"minute":55,"second":0,"nano":0},{"hour":10,"minute":0,"second":0,"nano":0},{"hour":10,"minute":5,"second":0,"nano":0},{"hour":10,"minute":10,"second":0,"nano":0},{"hour":10,"minute":15,"second":0,"nano":0},{"hour":10,"minute":20,"second":0,"nano":0},{"hour":10,"minute":25,"second":0,"nano":0},{"hour":10,"minute":30,"second":0,"nano":0},{"hour":10,"minute":35,"second":0,"nano":0},{"hour":10,"minute":40,"second":0,"nano":0},{"hour":10,"minute":45,"second":0,"nano":0},{"hour":10,"minute":50,"second":0,"nano":0},{"hour":10,"minute":55,"second":0,"nano":0},{"hour":11,"minute":0,"second":0,"nano":0},{"hour":11,"minute":5,"second":0,"nano":0},{"hour":11,"minute":10,"second":0,"nano":0},{"hour":11,"minute":15,"second":0,"nano":0},{"hour":11,"minute":20,"second":0,"nano":0},{"hour":11,"minute":25,"second":0,"nano":0},{"hour":11,"minute":30,"second":0,"nano":0},{"hour":11,"minute":35,"second":0,"nano":0},{"hour":11,"minute":40,"second":0,"nano":0},{"hour":11,"minute":45,"second":0,"nano":0},{"hour":11,"minute":50,"second":0,"nano":0},{"hour":11,"minute":55,"second":0,"nano":0},{"hour":12,"minute":0,"second":0,"nano":0},{"hour":12,"minute":5,"second":0,"nano":0},{"hour":12,"minute":10,"second":0,"nano":0},{"hour":12,"minute":15,"second":0,"nano":0},{"hour":12,"minute":20,"second":0,"nano":0},{"hour":12,"minute":25,"second":0,"nano":0},{"hour":12,"minute":30,"second":0,"nano":0},{"hour":12,"minute":35,"second":0,"nano":0},{"hour":12,"minute":40,"second":0,"nano":0},{"hour":12,"minute":45,"second":0,"nano":0},{"hour":12,"minute":50,"second":0,"nano":0},{"hour":12,"minute":55,"second":0,"nano":0},{"hour":13,"minute":0,"second":0,"nano":0},{"hour":13,"minute":5,"second":0,"nano":0},{"hour":13,"minute":10,"second":0,"nano":0},{"hour":13,"minute":15,"second":0,"nano":0},{"hour":13,"minute":20,"second":0,"nano":0},{"hour":13,"minute":25,"second":0,"nano":0},{"hour":13,"minute":30,"second":0,"nano":0},{"hour":13,"minute":35,"second":0,"nano":0},{"hour":13,"minute":40,"second":0,"nano":0},{"hour":13,"minute":45,"second":0,"nano":0},{"hour":13,"minute":50,"second":0,"nano":0},{"hour":13,"minute":55,"second":0,"nano":0},{"hour":14,"minute":0,"second":0,"nano":0}]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-20 07:08:58

不需要在这里转你自己的数据类型。

java.time.LocalTime

Java8及更高版本有适合这种情况的数据类型:java.time.LocalTime,一个没有日期和没有时区的时间。将此用于您的业务逻辑。从这些对象,您可以生成一个字符串表示,以显示给用户。

java.sql.Time

JDBC有一种数据类型,用于在数据库中或从数据库中传递这些值:java.sql.Time

代码语言:javascript
复制
String inputStart = "07:00";
String inputStop = "14:00";

LocalTime start = LocalTime.parse ( inputStart );
LocalTime stop = LocalTime.parse ( inputStop );
LocalTime nextTime = start;

Duration duration = Duration.ofMinutes ( 5 );

long initialCapacity = ( Duration.between ( start , stop ).toMinutes () / duration.toMinutes () ) + 1;  // Optional line of code.  Could be omitted.
List<LocalTime> times = new ArrayList ( ( int ) initialCapacity );
while (  ! nextTime.isAfter ( stop ) ) {
    times.add ( nextTime );
    nextTime = nextTime.plus ( duration );  //  Or call .plusMinutes( int ) and pass a number of minutes.
}

转储到控制台。

代码语言:javascript
复制
System.out.println ( "times: " + times + " initialCapacity: " + initialCapacity + " times.size " + times.size () );

时间: 07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:35,07:40,07:45,07:50,07:55,08:00,08:05,08:10,08:15,08:20,08:25,08:30,08:35,08:40,08:45,08:50,08:55,09:00,09:05,09:10,09:15,09:20,09:25,09:30,09:35,09:40、09:45、09:50、09:55、10:00、10:05、10:10、10:15、10:20、10:25、10:30、10:35、10:40、10:45、10:50、10:55、11:00、11:05、11:10、11:15、11:20、11:25、11:30、11:35、11:40、11:45、11:50、11:55、12:00、12:05、12:10、12:15、12:20、12:20,12:25,12:30,12:35,12:40,12:45,12:50,12:55,13:05,13:10,13:15,13:20,13:25,13:30,13:35,13:40,13:45,13:50,13:55,14:00 initialCapacity: 85 times.size 85

要输入数据库,请转换为java.sql.Time

代码语言:javascript
复制
java.sql.Time sqlTime = java.sql.Time.valueOf( myLocalTime );

时区

重要:请注意,您的原始代码和这个java.time代码示例都只使用假想的一天时间,假设一个虚构的24小时通用日。日照节约时间(DST)等反常现象意味着白天并不总是24小时长。您列出的某些时间在特定时区的特定日期上可能不存在。

如果您关心的是特定日期的真实时刻、有效时间,请使用java.time.ZonedDateTime (或.OffsetDateTime)。对于数据库传输,请使用java.sql.Timestamp

票数 1
EN

Stack Overflow用户

发布于 2016-02-19 15:44:56

我会以分钟为单位,使用%和/。有点像

代码语言:javascript
复制
Map<String,Integer> storage = new HashMap<String,Integer>();
for (int i=420; i< 840; i+=5)
{
     int hours = (i / 60);
     int minutes = (i % 60);
     String hourMinuteString = String.format("%02d", hours) + ":" 
                                      + String.format("%02d", minutes);
     storage.put(hourMinuteString, i);
}

然后您可以检索分钟数

代码语言:javascript
复制
 storage.get("10:45");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35509048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档