【问题标题】:JDE/Julian Time: How to format julian time stamp numberJDE/朱利安时间:如何格式化朱利安时间戳编号
【发布时间】:2013-04-12 16:48:49
【问题描述】:

在我的系统中,使用旧的 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 秒:01:22.15
上午 7 点 45 分 1 秒: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;
  }
);

【问题讨论】:

  • 为什么我不赞成这个问题:meta.stackexchange.com/a/149138/133242
  • 01:01:01如何返回?
  • 仅使用正则表达式是不够的。现有资源可以轻松回答您的问题:google.ca/…
  • 时间元素来自JDE ERP系统。它不是系统朱利安格式。在 JDE 的智慧 (???) 中,他们决定将所有日期转换为人类可读的数字并构建内部类来管理它们。例如,2013 年 4 月 12 日存储为 113102。1-->13
  • @AlexW 添加不起作用,因为它们不是自某个基本时间以来经过的秒数。我在答案中添加了一些关于传入格式的信息。

标签: javascript regex jdedwards


【解决方案1】:

以下内容适用于您的示例,但除此之外我还没有对其进行测试

//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保持一致。

【讨论】:

  • 正则表达式是个好东西。 MikeM,感谢您提供完美的解决方案!
【解决方案2】:

我给你一个线索:

  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());
});

【讨论】:

  • 分钟和秒只到 59。Lee Mador,非常感谢,这会让我继续前进。我正走在做子串的那条可怕的道路上,它变得太丑陋了。谢谢大家!
  • 相信我!如果传入的格式与我相信的一样,它将起作用。
  • 无论如何,我不认为数字计算是正确的答案。我们在这里处理 IEEE-754 “双精度”浮点值。后来OP明确了格式;我根本没有看到您正在处理“年”和“年中的一天”组件。
  • 我只询问 ERP 提供的时间元素,我在上面提到了日期格式(Julian DAY,而不是 Julian DATE)。我为混乱道歉。我的小问题的解决方法上面已经详细介绍了。
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多