2013-04-12 77 views
-2

在我的系统中,时间戳使用旧的IBM JULIAN格式返回。JDE/Julian时间:如何格式化JULIAN时间戳编号

例如:
12时0分以及1秒AM(午夜后1秒),返回01.
12时22分15秒AM返回2215
1 O”时钟22分15秒AM返回12215.
7时45分钟,1秒AM返回74501.
7点22分15秒PM返回192215.

我需要一个正则表达式将它们放入以下格式:
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点22分15秒PM:19:22.15

任何帮助理解。

SOLUTION 感谢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=zh-CN&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.017:45.01,以符合01:22.15

+1

这是一个了不起的正则表达式 –

+0

正则表达式是一个美丽的东西。 MikeM,谢谢你的完美解决方案! – radi8

1

我给你一个线索:

  1. 转换返回值给一个号码。
  2. num%100是秒。
  3. (num/100)%100是分钟数。
  4. (num/10000)是小时。
  5. 如果小时小于12,使用AM
  6. 如果小时是12个或更多,可以使用PM并且进一步地,如果它的13个或更多,减去12

另一种方式来做到这一点是将其视为一个字符串。但是你必须添加足够多的前导零来达到长度6,然后将其分解成2个字符位并将它们转换为'int',这样做的方式不仅仅是模拟100以及跳跃100和10,000。

从来就应该是在这两个数字部分的值大于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