Какой самый эффективный способ конвертировать long в HH: mm: ss и отобразить его в метке? - PullRequest
1 голос
/ 12 марта 2012

Я хочу, чтобы мои значения JLabel отображались в формате HH:mm:ss без использования каких-либо внешних библиотек.(метка будет обновляться каждую секунду)

Так, например, следующий ввод в секундах и желаемый вывод ниже:

Seconds:                             Output: 
--------------------------------------------------
long seconds = 0                    00:00:00
long seconds = 5                    00:00:05
long seconds = 500                  00:08:20
long seconds = 5000                 01:23:20

Note: the seconds value is of type long



Я знаю, чтообычно для получения нужных чисел достаточно выполнить следующие преобразования:

long s = 5000;              //total seconds 

long hrs = (s / 3600)       //hours
long mins = ((s%3600)/60)   //minutes
long secs = (s%60)          //seconds



Однако это оставляет десятичные значения для значений.Возможно, есть какое-то форматирование, которое позволит мне отбрасывать ненужные десятичные дроби.

Опции, с которыми я сталкивался, были String.format(), SimpleDateFormat() или конкатенация строки самостоятельно.

Дело в том, что я буду обновлять этот JLabel каждую секунду, и иногда он может сосчитать до 5-6 дней, если не дольше.

Так что я ищу кого-то, кто имеет больше опыта в этой области, чем я, и знает наиболее эффективный способ решения этой проблемы.

Ответы [ 7 ]

5 голосов
/ 13 марта 2012

Я бы использовал SimpleDateFormat на вашем месте.

Если SDF слишком медленный для вас, профилируйте все параметры и выберите самый быстрый, а затем рефакторируйте оставшуюся часть кода, пока он не станет достаточно быстрым.

Помните, что преждевременная оптимизация - корень всего зла , и что вам действительно следует проводить оптимизацию только после , когда вы профилировали свой код и пропустили целевое время выполнения.

3 голосов
/ 13 марта 2012

Используйте класс TimeUnit, как показано здесь в сочетании с классом javax.swing.Timer, установленным для выполнения с интервалами в 1 секунду.

3 голосов
/ 12 марта 2012

SimpleDateFormat () действительно вполне соответствует вашим потребностям.

2 голосов
/ 07 октября 2012

Я обнаружил, что это очень быстро.Попробуйте это.Секунды идут от 0 до 59, минуты идут от 0 до 59, часы идут от 0 до 2,562,047,788,015.После этого часы становятся отрицательными и начинают двигаться к этому максимуму.

выполнение оператора "+" в строках очень медленное.StringBuilder выполняет группирование строк быстрее всего из того, что я видел.Вы также должны использовать "chars", а не "String / Byte". Байты также очень медленные.Я предпочел бы делать только умножение, однако деление на 36 и 6 дает десятичные дроби, которые являются большими для удержания.

    StringBuilder sb = new StringBuilder(8);
    long hours = time / 3600000;
    long minutes = (time - hours * 3600000) / 60000;
    long seconds = (time - hours * 3600000 - minutes * 60000) / 1000;

    if (hours < 10)
        sb.append('0');
    sb.append(hours);
    sb.append(':');

    if (minutes < 10)
        sb.append('0');
    sb.append(minutes);
    sb.append(':');

    if (seconds < 10)
        sb.append('0');
    sb.append(seconds);

    String formattedTime = sb.toString();

.....

2 голосов
/ 13 марта 2012

Если вы не возражаете против переноса значений, используйте SimpleDateFormat следующим образом.Не забудьте x1000 преобразовать в миллисекунды и вручную переопределить часовой пояс.

long value = 5 * 24 * 3600 + 5000;

// wrapping solution
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
// ensure no daylight saving +1 hour
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sdf.format(value * 1000));

Вывод

01:23:20

Если вы хотите, чтобы часы прошли 23,59,59, то это самое простое, что я мог быпридумать.Я использовал DecimalFormat, чтобы заставить по крайней мере 2 цифры для часов.

long value = 5 * 24 * 3600 + 5000;

long hours = value / 3600; // whole hours
long mins = value / 60 - hours * 60;
long secs = value % 60;
System.out.println(String.format("%s:%2d:%2d",
        new DecimalFormat("00").format(hours), mins, secs));

Вывод

121:23:20
1 голос
/ 13 марта 2012

Если вы не хотите использовать класс форматирования, вы можете выполнить свою работу, используя базовые операции, такие как преобразование между классами-обертками и операции String. Посмотрите на этот код:

long h, m, s; // Initialize them after calculation.
String h1, m1, s1;

h1 = Long.toString( h );
m1 = Long.toString( m );
s1 = Long.toString( s );

if ( s1.length() < 2 )
    s1 = "0" + s1;
if ( m1.length() < 2 )
    m1 = "0" + m1;
if ( h1.length() < 2 )
    h1 = "0" + h1;

String output = h1+":"+m1+":"+s1;

Предположим, у вас есть правильно рассчитанные значения секунд, минут и часов , вы можете собрать строковые версии этих переменных, затем отформатировать их с помощью простой проверки длины и, наконец, объединить эти части единицы времени.

1 голос
/ 12 марта 2012

Я думаю, что вы хотите сделать математику, которую вы указали, но взять слово каждого значения. затем объединить ..

public class Test{ 
   public static void main(String args[]){
      double d = -100.675;
      float f = -90;    

      System.out.println(Math.floor(d));
      System.out.println(Math.floor(f)); 

      System.out.println(Math.ceil(d));
      System.out.println(Math.ceil(f));
   }
}
...