【问题标题】:World Clock in Javascript not getting the hours properlyJavascript中的世界时钟没有正确获取时间
【发布时间】:2016-01-27 15:49:48
【问题描述】:

我制作了非常基础的 JavaScript 世界时钟。我让它工作了,但是不同城市的时间没有按我想要的更新。例如,悉尼与英国的时差是 11 小时,所以我添加了 11 小时以上。然后我添加了一个条件来将时间格式化为 12 小时格式,如下所示 悉尼时间 > 12 sydneyHours -= 12;

但它仍然显示 11 + 本地时间的任何小时数,例如(16:46:49);

此外,我们将不胜感激任何改进建议。

非常感谢

function timeNow(){
	var currentTime = new Date();
	var hours = currentTime.getHours();
	var minutes = currentTime.getMinutes();
	var seconds = currentTime.getSeconds();
	var meridiem = "AM";
	var isbHours = 5 + hours;
	var romeHours = 1 + hours;
	var sydneyHours = 11 + hours;

	
	if(seconds < 10){
		seconds = "0" + seconds;
	}

	if(minutes < 10){
		minutes = "0" + minutes;
	}

	if(hours < 10){
		hours = "0" + hours;
	}

	if(sydneyHours < 10){
		sydneyHours = "0" + sydneyHours;
	}

	if(hours > 12){
		hours = hours - 12;
		meridiem = "PM";
	}

	if(isbHours > 12){
		isbHours = isbHours - 12;
		meridiem = "PM";
	}

	if(romeHours > 12){
		romeHours = romeHours - 12;
		meridiem = "PM";
	}

	if(sydneyHours > 12){
		sydneyHours = sydneyHours - 12;
		meridiem = "PM";
	}
	




	var localClock = document.getElementById('localClock');

	localClock.innerText = hours + ":" + minutes + ":" + seconds + " " + meridiem;
	localClock.innerText += "\n" + "Local Time";

	var isbClock = document.getElementById('isbClock');
	isbClock.innerText = isbHours + ":" + minutes + ":" + seconds + " " + meridiem;
	isbClock.innerText += "\n" + "Islamabad Time";

	var sydneyClock = document.getElementById('sydneyClock');
	sydneyClock.innerText = sydneyHours + ":" + minutes + ":" + seconds + " " + meridiem;
	sydneyClock.innerText += "\n" + "Sydney Time";



	var romeClock = document.getElementById('romeClock');
	romeClock.innerText = romeHours + ":" + minutes + ":" + seconds + " " + meridiem;
	romeClock.innerText += "\n" + "Rome Time";
}

setInterval(timeNow, 1000);
#localClock {
	background: #87D4ED;
}
#isbClock {
	background: #EDDB11;
}

#sydneyClock {
	background: #F27D66;
}

#romeClock {
	background: #F09E2B;
}

#worldclock {
	width: 800px;
	margin: 50px auto;

}
#localClock, #isbClock, #sydneyClock, #romeClock {
	font-size: 40px;
	font-family: arial, monospace;
    position: relative;
    top: 0; left: 0; right: 0; bottom: 0;
    color: #fff;
    padding-top: 70px;
    text-align: center;
    width: 400px;
    height: 200px;
    float: left;
}
<div id="worldclock">

	<div id="localClock"></div>
	<div id="isbClock"></div>
	<div id="sydneyClock"></div>
	<div id="romeClock"></div>
	
 </div>

【问题讨论】:

  • 我看到它显示正确的时间。 (例如下午 6:59:50)...
  • 要获取任何时区的时间,请使用 UTC 方法:从实际 UTC 小时或分钟中添加/减去时间,然后使用 getUTC* 方法获取调整后的时间。

标签: javascript html css date


【解决方案1】:

与悉尼时间有关的最初问题是因为您没有考虑到您的小时变量超过 24 的事实。

当当地时间在下午时,您将时差加上 11 小时,然后减去 12 以尝试转换为 12 小时制。

这是发生了什么

16 //local hours
+ 11 = 27 // time zone adjustment
-12 = 15 // attempt to convert to 12 hour clock

弥补这一点的最简单方法是使用modulus operator

var sydneyHours = (11 + hours) % 24;

然而,这确实带来了一个新问题,因为悉尼现在将在实际上是 AM 时显示 03:43:23 PM,因为您为所有时区使用了一个单一的 meridiem 变量,如果其中一个是 PM,它们都被设置为 PM . learn the concept of objects 对您来说可能是一个很好的情况。您可以为每个城市创建一个新对象,并为其分配自己的 hourmeridiem 属性值,然后分别读取它们。

【讨论】:

    【解决方案2】:

    您可能想尝试一下 Moment Timezone:http://momentjs.com/timezone/

    原因:你会在尝试找出每个国家/地区的时区时感到痛苦。

    如果该 url 不再起作用(我没想到),请尝试他们的 github repo:https://github.com/moment/moment-timezone/

    您的代码的另一个大问题:

    永远不要使用getHours() 等来完成这项任务。他们将返回运行浏览器的计算机的本地时间。请改用getUTCHours() 等。
    srsly。试一试momentjs。在实施时区的过程中,您会从字面上避免很多痛苦。

    由于政治等原因,时区定义往往会不时改变。这甚至会改变日常节约时间

    【讨论】:

    • 通常我会 100% 同意你的观点,由于手头的问题非常复杂,每个人都应该使用库来解决日期时间和时区问题,但我感觉原始代码创建得更多出于学习目的而不是任何现实世界的使用场景,他们不会仅仅通过将库粘合在一起来学习任何东西。
    • @SimonWest 从学习的角度来看你是完全正确的。一般来说,弄乱“时间”对学习来说是一件好事。回首往事,但我希望有一个像这样的库可用于生产性使用。对于琐碎的事情,我同意。对于时区,我没有。特别是如果我看到有人在生产中实际使用手工制作的时区管理(我经常看到)。是的,它确实需要一些经验来摆弄时间来实现这样的目标:gottz.de/uhr.htm 但是是的。大多数教程都很糟糕,遗憾的是它们很容易找到。
    • 这应该是评论,它不回答OP的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2013-08-19
    • 2021-07-26
    • 2013-10-23
    相关资源
    最近更新 更多