0

在我的系统中,使用旧的 IBM julian 格式返回时间戳。

例如:
12 点 0 分 1 秒 AM(午夜后 1 秒)返回 01。12
点 22 分 15 秒 AM 返回 2215。1
点 22 分 15 秒 AM 返回 12215 .
7 点 45 分 1 秒 AM 返回 74501。
7 点 22 分 15 秒 PM 返回 192215。

我需要一个正则表达式将它们转换为以下格式:
12 点钟 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

任何帮助表示赞赏。

解决方案 感谢 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;
  }
);
4

2 回答 2

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

于 2013-04-12T18:47:38.220 回答
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());
});
于 2013-04-12T16:57:18.897 回答