作为一个初学者,我面临一些问题。甚至我都无法通过谷歌搜索找到任何解决方案。

问题:用我的语言(孟加拉语),整个白天有五个字符串(Sokal,Dupur,Bikal,Sondha,Raat),而不是国际的两个字符串(Am,Pm)。

我写了这篇,但是对我没有多大帮助。

    var time = new Date();

    var hour = time.getHours();
    var text = "sokal";

    if(hour == 13){
      text = "dupur";
    }else if(hour == 16){
      text = "bikal";
    }else if(hour == 18){
     text = "sondha";
    }else if(hour == 20){
      text = "raat"
    }

    console.log(text);


我要打印:

6Am to 11Am as 06:00 Sokal;
12Pm to 3pm as 12:00 Dupur;
4 Pm to 5Pm as 04:00 Bikal;
6 pm to 7pm as 06:00 Sondha;
8 pm to 5Am as 08:00 Raat;

最佳答案

您应该使用relational operators(如<><=>=)将小时与不同的范围进行比较。例如,如果小时小于6,则周期为raat

还要注意,您不必为每个范围进行两次比较。如果小时数不小于6,则您知道小时数大于或等于7,因此请充分利用else来降低每个后续if的复杂度。

如果我了解您的要求,它将看起来像这样:

function fmtPeriod(hour) {
  if (hour < 6) {
    return "Raat";
  } else if (hour < 12) {
    return "Sokal";
  } else if (hour < 16) {
    return "Dupur";
  } else if (hour < 18) {
    return "Bikal";
  } else if (hour < 20) {
    return "Sondha";
  } else {
    return "Raat"
  }
}


准确地格式化日期可以很好地涉及不同的特定于语言环境的规则,但是再次,根据您所描述的,这是一个刺耳的事情:



function fmtPeriod(hour) {
  if (hour < 6) {
    return "Raat";
  } else if (hour < 12) {
    return "Sokal";
  } else if (hour < 16) {
    return "Dupur";
  } else if (hour < 18) {
    return "Bikal";
  } else if (hour < 20) {
    return "Sondha";
  } else {
    return "Raat"
  }
}

function fmtHour(hour) {
  return `0${hour % 12 || 12}`.substr(-2);
}
function fmtMinutes(minutes) {
  return `0${minutes}`.substr(-2);
}

var input = document.getElementById("in");
var output = document.getElementById("out");

function formatOutput() {
   const date = new Date("01 Jan 1970 " + input.value);
   const hour = date.getHours();
   const min = date.getMinutes();
   output.innerText = `${fmtHour(hour)}:${fmtMinutes(min)} ${fmtPeriod(hour)}`
}

input.addEventListener('change', formatOutput);

input.value = `${new Date().getHours()}:${new Date().getMinutes()}`;
formatOutput();

#out { font-family: monospace }

<input id="in" type="time">
<span id="out"></span>





当然,比我更大的头脑投入了很多时间来解决这种问题。我建议您使用标准的toLocaleTimeString方法。它可能无法完全满足您的要求,但是它通常足够满足大多数用户的需求,并且可以处理所有更复杂的边缘情况,这是单个开发人员难以抓住的:



const outputs = ['en-US', 'bn', 'bn-u-hc-h24'];

var input = document.getElementById("in");

function formatOutput() {
  const date = new Date(`01 Jan 1970 ${input.value}`);
  outputs.forEach(id => {
    const output = document.getElementById(id);
    output.innerText = date.toLocaleTimeString(id);
  });
}

input.addEventListener('change', formatOutput);

input.value = `${new Date().getHours()}:${new Date().getMinutes()}`;
formatOutput();

span {
  font-family: monospace;
}

span::after {
  content: attr(id);
  padding: 0 1em;
}

<input id="in" type="time"><br>
<span id="en-US"></span><br>
<span id="bn"></span><br>
<span id="bn-u-hc-h24"></span><br>





如果您对管理npm软件包感到满意,还可以查看类似date-and-timetry in RunKit)的内容:

var date = require("date-and-time");

let now = new Date();
date.locale('bn');
date.format(now, 'HH:mm A');
// 16:33 দুপুর


同样,这可能不是您想要的确切结果,但是与尝试自己实现等效逻辑相比,它可能容易得多且出错率更低。

08-19 14:51