Saya menggunakan javascript untuk menulis perintah untuk bot perselisihan. Perintah ini digunakan untuk melihat "koin" Anda yang terkait dengan nama pengguna/ID Anda dan menukarkan sejumlah koin setiap hari dan setiap minggu. Jika Anda telah menukarkan koin Anda untuk hari/minggu itu, ini menunjukkan pesan yang memberi Anda waktu hingga penukaran berikutnya dimungkinkan. Jumlah waktu itu diturunkan dari persamaan ini:

var timeInt = oneWeek - (dateNow - gambler.weeklyDate);
var dateDif = new Date(timeInt);

OneWeek adalah konstanta untuk jumlah milidetik dalam satu minggu (604800000), dateNow adalah tanggal saat ini sebagai bilangan bulat milidetik dan gambler.weeklyDate adalah tanggal penukaran terakhir yang disimpan sebagai bilangan bulat milidetik.

var nextRedeem =
     dateDif.getUTCDate() +
     ":" +
     dateDif.getUTCHours() +
     ":" +
     dateDif.getMinutes() +
     ":" +
     dateDif.getSeconds();

Ketika saya menampilkan waktu yang diformat sebagai hari: jam: menit: detik menggunakan .getDate() atau .getUTCDate() dan membuat string dengan nilai, nilai hari selalu 1 lebih tinggi dari yang seharusnya.

Saya percaya semua nilai benar dan akan ditampilkan sebagai 6:23:59:59 jika perintah dijalankan lagi 1 detik setelah penukaran, tetapi ditampilkan sebagai 7:23:59:59 yang salah. Ada perbaikan untuk ini?

0
h8b1t 5 Januari 2021, 00:29

3 jawaban

Jawaban Terbaik

Jenis JS Date() tidak terlalu cocok untuk mewakili interval. Membuat new Date() dari angka akan selalu menghasilkan stempel waktu aktual dan bukan interval. Dalam kasus khusus Anda, tanggal yang dihasilkan kemungkinan besar akan menjadi stempel waktu antara 1970-01-01T00:00 dan 1970-01-07T23:59:59. Tentu saja Anda dapat menafsirkan tanggal itu sebagai interval waktu, tetapi kemudian Anda harus mengurangi 1 dari tanggal Anda, karena getDate() mengembalikan tanggal dalam sebulan dan bulan dimulai dengan hari 1 dan bukan 0

Jika Anda tahu bahwa penukaran berikutnya akan diizinkan dalam nextredeem milidetik, Anda dapat dengan mudah mendapatkan jumlah hari, jam, menit, ... berdasarkan operasi pembagian dan modulo yang benar

let nextreedeem = ....;  //number of millisecons till next redeem

let days = Math.floor(nextreedem / 86400000);  
nextredeem = nextredem % 86400000;
let hours = Math.floor(nextredeem / 3600000);
nextredeem = nextredeem % 3600000;
let minutes = Math.floor(nextredeem / 60000);
nextredeem = nextredeem % 60000;
let seconds = Math.floor(nextredeem / 1000);
let milliseconds = nextredeem % 1000;
0
derpirscher 4 Januari 2021, 21:56

GetUTCDate mengembalikan hari dalam sebulan, yaitu antara 1 dan 31. Ini akan berfungsi untuk tujuan Anda, tetapi karena tidak dapat mengembalikan 0, Anda harus selalu mengurangi satu untuk menggunakannya seperti yang Anda rancang.

0
Russ 4 Januari 2021, 21:38

getUTCdate() hanya memeriksa hari dalam sebulan. Penyihir berarti bahwa jika satu tanggal adalah hari Sabtu ad 14:00, dan yang lainnya adalah hari Sabtu berikutnya pada pukul 13:59, perbedaannya akan tetap 7 hari, dan bukan 6 hari, 23 jam...dst.

Solusi yang mungkin adalah menghitung hari sendiri mulai dari total milidetik:

const days = Math.floor(dateDif / (1000 * 60 * 60 * 24));

Hanya mengurangi 1 dari getUTCDate() tidak akan bekerja dengan benar. Jika selisih antara oneWeek dan (dateNow - gambler.weeklyDate) kurang dari 24 jam, kemungkinan keduanya berada pada hari yang sama, jadi selisihnya adalah 0, dan jika Anda mengurangi 1, Anda mendapatkan -1.

0
clod9353 4 Januari 2021, 21:54