有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

string Java如何从Date获取HH:mm:ss

对于我的第一个Java应用程序,我正在制作秒表。秒表以小时、分钟和秒的形式显示过去的时间。就像00:00:00

我希望在一定时间(用户定义)过去后显示警报(警报框,无论什么)

以下是生成秒表显示的代码(忽略分秒,我们不关心警报的分秒):

    swChronometer = new Timer(10, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            int decisec = (int)(System.currentTimeMillis() - swWatchStart) / 10; // 10 x millisecond
            int seconds = decisec / 100;
            int days = seconds / 86400; // 86400 seconds in a day
            int hours = (seconds / 3600) - (days * 24); // 3600 seconds in a hour
            int min = (seconds / 60) - (days * 1440) - (hours * 60); // 60 seconds in a min
            int sec = seconds % 60;
            int decis = decisec % 100;

            //------------------------------------------------------- format the ints
            DecimalFormat formatter = new DecimalFormat("00");
            String hoursFormatted = formatter.format(hours);
            String minFormatted = formatter.format(min);
            String secFormatted = formatter.format(sec);
            String decisFormatted = formatter.format(decis);

            //------------------------------------------------------- update display
            String s = new String(""+hoursFormatted+":"+minFormatted+":"+secFormatted+"");
            String sDs = new String(decisFormatted);
            swDisplayTimeLabel.setText(s);
            swDisplayDeciseconds.setText(sDs);
        }        
    });

正如您所见,计时器整数最终会转换为字符串,然后显示出来

有用于After和Every的单选按钮,因此在n时间量之后或每隔n时间量之后发出警报

我有一个JSpinner,用户可以定义n时间,该时间的格式仅显示00:00:00:

    // ----------------------------------
    // set spinner format
    // ----------------------------------
    // inital date at 12pm 00:00:00
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 24); // 24 == 12 PM == 00:00:00
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);

    swSpinnerTime.setValue(calendar.getTime());

    // format field
    JSpinner.DateEditor editor = new JSpinner.DateEditor(swSpinnerTime, "HH : mm : ss");           
    DateFormatter formatter = (DateFormatter)editor.getTextField().getFormatter();
    formatter.setAllowsInvalid(false); // sets it so user cant edit colon
    formatter.setOverwriteMode(true);

    swSpinnerTime.setEditor(editor);

还有一个组合框,用户可以选择什么类型的报警

每当用户对这些输入中的任何一个进行操作时,就会调用我的函数来处理它:

private void swAlarmSettings() {
    //------------------------------------------------------- which radio is selected
    String swRadioText = "";

    if(swRadioAfter.isSelected()) {
        swRadioText = swRadioAfter.getText();
    }

    if(swRadioEvery.isSelected()) {
        swRadioText = swRadioEvery.getText();
    }

    // debug
    System.out.println("Radio Selected: " +swRadioText);

    //------------------------------------------------------- which time is selected     
    Date swSpinnerTimeValue;  
    swSpinnerTimeValue = (Date)swSpinnerTime.getValue();

    // debug
    System.out.println("swSpinnerTimeValue: " +swSpinnerTimeValue);

    //------------------------------------------------------- which alarm is selected
    String swDropDownSelected = (String)swDropDown.getSelectedItem();

    // debug
    System.out.println("swDropDownSelected: " +swDropDownSelected);       
}

但是,无论何时调用此函数,它都会将日期打印为:

   swSpinnerTimeValue: Tue Oct 14 00:00:00 BST 2014

这就是我被困在如何继续下去的地方。当我已经在JSpinner中格式化它时,我没想到会显示整个日期(尽管它是错误的(今天是10月13日,而不是14日))

所以我假设我需要以某种方式解析这个值,去掉我不需要的数据,只剩下HH:mm:ss,然后将其转换为字符串,这样我就可以将其与秒表显示(String swDisplayTimeLabel)进行比较,然后在匹配后触发警报

我希望我已经清楚地表达了我的疑问,并提供了足够的信息。谢谢你的帮助

我在Netbeans中工作,并使用Swing设计部分创建我的应用程序


共 (2) 个答案

  1. # 1 楼答案

    Java ^{}是即时的,不会保留预期的输出格式。为此,您需要使用DateFormat。比如

    System.out.println("swSpinnerTimeValue: " + new SimpleDateFormat("HH:mm:ss")
        .format(swSpinnerTimeValue));
    
  2. # 2 楼答案

    tl;博士

    这个问题和其他答案使用了麻烦的旧日期时间类,现在是遗留的,被java取代。时间课

    Duration.between( 
        instantThen ,
        Instant.now().truncatedTo( ChronoUnit.SECONDS )
    )
    

    …还有

    String.format( 
        "%02d:%02d:%02d", 
        duration.toHoursPart() , 
        duration.toMinutesPart() , 
        duration.toSecondsPart() 
    )
    

    使用java。时间

    ^{}类表示UTC中时间轴上的一个时刻,分辨率为nanoseconds(最多九(9)位小数)

    Instant instant = Instant.now() ;
    

    你似乎只关心整秒钟。所以我们可以删掉任何分数秒

    Instant instant = Instant.now().truncatedTo( ChronoUnit.SECONDS ) ;
    

    要以小时-分-秒的粒度表示与时间线无关的时间跨度,请使用Duration

    Duration duration = Duration.between( then , instant ) ;
    

    您可以以标准ISO 8601格式PTxHxMxS生成一个表示时间跨度的字符串,其中P标记开始,而T将任何年、月、日与时、分、秒分开。所以一个半小时是PT1H30M

    String output = duration.toString();
    

    要获得时钟样式的显示,请创建自己的字符串。为了得到每一部分,小时、分钟和秒,你必须做自己的数学,类似于Java8中的问题。在Java9和更高版本中,可以调用the ^{} methods

    int hours = duration.toHoursPart() ;
    int minutes = duration.toMinutesPart() ;
    int seconds = duration.toSeconds() ;
    
    String output = String.format("%02d:%02d:%02d", hours , minutes , seconds ) ;