#javascript #timer #timezone #countdown
#javascript #таймер #Часовой пояс #обратный отсчет
Вопрос:
возможно ли, чтобы таймер обратного отсчета был одинаковым для всех людей, независимо от их часового пояса, когда я ставлю дату, таймер будет отображаться по-разному в зависимости от часового пояса, и я хочу, чтобы они синхронизировались, чтобы все получали одно и то же время, потому что теперь «ГОТОВО» будет отображаться в разное время в зависимости отстрана.
вот код, спасибо за любую помощь!
<head>
<title>
TITLE TEXT
</title>
<meta charset="utf-8">
<meta name="Description" CONTENT="Text">
<link rel="icon" type="image/png" href="" />
<style>
.dropdown {
width: 600px;
padding: 0px;
padding-top:100px;
padding-bottom:150px;
}
table {
border-width: 70px;
border-color: black;
background-color: #DCF5F1;
}
.dropdown {
margin: auto;
}
th {
border: 2px solid black;
}
td {
border: 2px groove black;
}
a {
text-decoration: none;
color:black;
}
a:hover {
color: grey;
text-decoration: underline;
}
table {
width: 600px;
table-layout: fixed;
font-size: 20px;
}
table td {
padding: 20px;
font-weight: bold;
font-family: arial;
}
#timer .endsoon {
color: red;
}
</style>
</head>
<body>
<div class="dropdown">
<table id="timer">
<tbody>
<tr>
<td class="headtext">TITLE</td>
<td class="headtext">TIMER</td>
</tr>
</tbody>
</table>
</div>
</body>
<script>
var arr = [
// Date...................Link..............Title
['Dec 16, 2020 01:00:00', 'www.google.com', 'text'],
['Dec 16, 2020 01:00:00', 'www.google.com', 'text'],
['Dec 16, 2020 05:00:00', 'www.google.com', 'text'],
['Dec 16, 2020 05:00:00', 'www.google.com', 'text'],
['Dec 16, 2020 05:00:00', 'www.google.com', 'text'],
['Dec 16, 2020 05:00:00', 'www.google.com', 'text'],
['Dec 16, 2020 05:00:00', 'www.google.com', 'text'],
['Dec 16, 2020 05:00:00', 'www.google.com', 'text'],
['Dec 16, 2020 05:00:00', 'www.google.com', 'text'],
['Dec 16, 2020 05:00:00', 'www.google.com', 'text'],
['Dec 16, 2020 05:00:00', 'www.google.com', 'text'],
['Dec 16, 2020 05:00:00', 'www.google.com', 'text'],
['Dec 16, 2020 03:10:25', 'www.google.com', 'text'],
['Dec 16, 2020 03:10:25', 'www.google.com', 'text'],
['Dec 16, 2020 03:10:25', 'www.google.com', 'text'],
['Dec 16, 2020 03:10:25', 'www.google.com', 'text'],
['Dec 16, 2020 03:10:25', 'www.google.com', 'text'],
];
// Remove after 5min
var remAft = 10;
// Get element with ID "timer"
var wrap = document.querySelector('#timer tbody');
// For loop Array "arr"
for (var i = 0; i < arr.length; i ) {
if (checkDate(arr[i][0])) {
// Adds the elements of the table with filled in information
wrap.innerHTML = '<tr><td><a href="' arr[i][1] '">' arr[i][2] '</a></td><td id="' 'demo' (i 1) '"></td></tr>'
// Invokes the function by passing as arguments Date and ID
new myTimers(arr[i][0], 'demo' (i 1));
}
}
function checkDate(tim) {
var countDownDate = new Date(tim).getTime();
var now = new Date().getTime();
var distance = countDownDate - now;
if (distance > -60 * 1000 * remAft) { return true; } else { return false; }
}
function myTimers(tim, ele) {
// Set the date we're counting down to
var countDownDate = new Date(tim).getTime();
// Update the count down every 1 second
var x = setInterval(function () {
// Get today's date and time
var now = new Date().getTime();
// Find the distance between now and the count down date
var distance = countDownDate - now;
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
// Display the result in the element with id="demo"
document.getElementById(ele).innerHTML = days "d " hours "h "
minutes "m " seconds "s ";
// If the count down is finished, write some text
if (distance < 0) {
if (distance > -60 * 1000 * remAft) {
document.getElementById(ele).innerHTML = "DONE";
document.getElementById(ele).classList.add('dropped');
document.getElementById(ele).style.color = 'tomato';
document.getElementById(ele).style.textDecoration = "line-through";
} else {
clearInterval(x);
var chekEl = document.getElementById(ele);
if (chekEl) {
chekEl.parentElement.remove();
}
}
}
// If days is 0 add class 'endsoon'
if (days === 0) {
document.getElementById(ele).classList.add('endsoon');
}
}, 1000);
}
</script>
</html>```
Ответ №1:
По сути, вы создаете свое целевое время как:
new Date("Dec 16, 2020 03:10:25")
Это нестандартный формат, и большинство браузеров будут интерпретировать его в терминах местного времени.
Вместо этого выберите момент времени, основанный на UTC, и передайте его в формате ISO 8601 / RFC 3339.
Например, если вы имели в виду 3:10:25 в часовом поясе со смещением UTC 1, вычтите 1 час, чтобы получить 2:10:25 UTC, представленный следующим образом:
new Date("2020-12-16T02:10:25Z")
Используйте значения в этом формате в вашем исходном массиве, и у всех будет одна и та же цель для обратного отсчета. Имейте в виду, что Z
в конце означает UTC, поэтому не забудьте включить это.
В качестве альтернативы вы можете использовать местное время и локальное смещение, действующее для этого времени, вместо вычитания. Это выглядит так:
new Date("2020-12-16T03:10:25 01:00")
Вы можете использовать любую форму, в зависимости от того, какая из них вам удобнее.
Комментарии:
1. я не знаю, как реализовать это в моем исходном коде. Мой часовой пояс — GMT 1, и мне нужны таймеры обратного отсчета, чтобы отсчитывать время до одного и того же времени независимо от часового пояса, можете ли вы помочь мне добавить это в мой код?
2. Ваши значения даты в вашем исходном коде, которые вы показали, находятся в первом элементе
arr
массива. Если у вас GMT 1, то просто вычтите час и переформатируйте эти строки вYYYY-MM-DDTHH:MM:SSZ
формат. Однако будьте осторожны в отношении изменений смещения из-за летнего времени. Возможно, сейчас GMT 1, но это не имеет значения. Имеет значение только смещение для заданной метки времени. Если вы находитесь по Гринвичу 2 или по Гринвичу 0 в какое-то другое время года, временные метки должны отражать это соответствующим образом.3. В качестве альтернативы вы можете использовать местное время и действующее смещение по местному времени. Я обновляю свой ответ, чтобы показать и то, и другое.
4. значит, мне придется вручную проверять летнее время и соответствующим образом изменять смещения?
5.
01:00
это смещение от UTC.03:10:25 01:00
означает 3:10:25 по местному времени, где смещение равно UTC 1. Это не означает 4:10:25. Да, вам нужно будет указать правильное смещение.
Ответ №2:
Вы можете использовать getTimezoneOffset для дальнейшей настройки времени, чтобы каждый мог использовать, скажем, время UTC. (Смещение часового пояса — это разница в минутах между UTC и местным временем. )
var offset = new Date().getTimezoneOffset();
console.log(offset);
Комментарии:
1. привет! где в коде я могу реализовать это, чтобы это работало? часовой пояс, в котором я нахожусь, — GMT 1