2013-04-12 3 views
-2

В моей системе временные метки возвращаются с использованием старого формата IBM julian.JDE/Julian Time: Как форматировать julian time stamp number

Например:
12 часов 0 минут и 1 секунда AM (1 сек) после полуночи возвращаются 01.
12 часов 22 минут и 15 секунд AM возвращаются 2215.
-о» часы 22 минуты и 15 секунд AM возвращается 12215.
7:00 45 минут и 1 секунда AM возвращаются 74501.
7:00 22 минут и 15 секунд PM возвращаются 192215.

Мне нужен выражение regex, чтобы поместить их в формат:
12 o'cloc k 0 минут и 1 секунда AM (1 с после полуночи): 00: 00.01
12 часов 22 минуты и 15 секунд AM: 00: 22,15
1 час 22 минуты и 15 секунд AM: 01: 22,15
7 часов 45 минут и 1 секунда AM: 7: 45.01
7:00 22 минуты и 15 секунд ЛС: 19: 22.15

Любая помощь оценена.

РЕШЕНИЕ Благодаря MikeM, вот решение:

//var time = '01'; 
//var time = '2215'; 
//var time = '12215'; 
//var time = '74501'; 
var time = '192215'; 

time = time.replace(/^(?:(?:(\d)?(\d))?(\d\d))?(\d\d)$/, 
    function (all, hr1, hr2, min, sec) { 
    return (hr1 || '0') + (hr2 || '0') + ':' + (min || '00') + '.' + sec; 
    } 
); 
+0

Почему я ниспроверг этот вопрос: http://meta.stackexchange.com/a/149138/133242 –

+0

Как возвращается 01:01:01? –

+0

Использовать только регулярное выражение не хватит. Существуют существующие ресурсы, которые могут легко ответить на ваш вопрос: https://www.google.ca/#hl=ru&sclient=psy-ab&q=julian+to+date+javascript&oq=julian+to+date+javascript – sweetamylase

ответ

2

Следующие работы с вашими примерами, хотя я не проверял за этого

//var time = '01'; 
//var time = '2215'; 
//var time = '12215'; 
//var time = '74501'; 
var time = '192215'; 

time = time.replace(/^(?:(?:(\d)?(\d))?(\d\d))?(\d\d)$/, 
    function (all, hr1, hr2, min, sec) { 
    return (hr1 || '0') + (hr2 || '0') + ':' + (min || '00') + '.' + sec; 
    } 
); 

Хотя это дает 07:45.01 не 7:45.01, чтобы соответствовать 01:22.15.

+1

Это замечательное регулярное выражение –

+0

Regex - красивая вещь. MikeM, СПАСИБО за идеальное решение! – radi8

1

Я дам вам подсказку:

  1. Преобразовать возвращаемого значения числа.
  2. num% 100 - секунды.
  3. (num/100)% 100 - это минуты.
  4. (num/10000) - часы.
  5. Если часы меньше 12, используйте AM
  6. Если часы составляет 12 или более, используйте ПМ и далее, если его 13 или более, вычтите 12.

Другой способ сделать это рассматривать его как строку. Но тогда вам нужно добавить достаточное количество начальных нулей, чтобы добраться до длины 6, а затем разбить его на 2 символьных бита и преобразовать их в «int», и это более эффективная работа, чем просто изменение на 100 и дайвинг на 100 и 10000.

Там никогда не должно быть значение в этих двух цифр секций больше, чем 59.

Примечание

@ radi8 заметил кое-что я оставил вне. Я должен был заметить, что «/» (деление) в вышеприведенном алгоритме должно быть целочисленной арифметикой для правильной работы. Некоторые языки программирования предлагают целочисленную арифметику. JavaScript нет.

Поскольку JavaScript использует арифметику с плавающей запятой, он вычитает количество секунд перед делением. Затем аналогичное вычитание количества минут фиксирует следующий шаг.

Вы также можете использовать Math.floor() после деления, чтобы выполнить одно и то же (поскольку это положительные числа).

Вот код OP в модификации, чтобы сделать это:

$(function() { 
    var val1 = 41215,hr=0,min=0,sec=0; 
    sec = val1%100; 
    val1 = Math.floor(val1/100); 
    min = val1%100; 
    hr = Math.floor(val1/100); 
    // format the result. This example could show 1:1:1 instead of 01:01:01 
    tst2 = hr.toString()+':'+min.toString()+'.'+sec.toString(); 
    alert(tst2.toString()); 
}); 
+0

минут и секунд только до 59. Ли Мадор, спасибо большое, это заставит меня идти. Я шел по этой ужасной дороге делать подстроки, и это просто слишком уродливо. Спасибо всем! – radi8

+0

Поверь мне! Он будет работать, если входящий формат будет таким, какой я считаю. –

+0

Я не думаю, что только количественное вычисление является правильным ответом. Здесь мы имеем дело с значениями с плавающей запятой с двойной точностью IEEE-754. И позже OP четко сформулировал формат; Я не вижу, что вы обрабатываете компоненты «год» и «день года» вообще. – PointedEars