javascript - 如何获得服务器加入和今天 discord.js v12 之间的正确时差?

标签 javascript node.js date discord.js

我正在处理我的用户信息命令,但遇到了一个问题,当我显示某人加入服务器的时间时,它有时会显示正确的时间,有时则不会。我认为这是由时区引起的。我的代码就在这里:

const { DiscordAPIError } = require('discord.js');
const Discord = require('discord.js');
const moment = require('moment');

module.exports = {
 name: 'profile',
 description: 'The bot will return the info about the user',
 execute(message, args) {
  let userinfoget =
   message.mentions.members.first() ||
   message.guild.members.cache.get(args[0]) ||
   message.member;

  var isBot = 0;
  if (userinfoget.user.bot) {
   isBot = 'This account is a bot';
  } else {
   isBot = "This account isn't a bot";
  }

  var status = userinfoget.presence.status;
  if (status == 'online') {
   status = `<:statusonline:750346592242106368> This user is currently online`;
  } else if (status == 'idle') {
   status = `<:statusidle:750346522847215760> This user is currently idle`;
  } else if (status == 'dnd') {
   status = `<:statusdnd:750346486398582815> This user has currently do not disturb mode on`;
  } else if (status == 'offline') {
   status = `<:statusoffline:750346558809047090> This user is currently offline (or lurking <:lurklias:750342622463262751>)`;
  } else {
   status == `Unable to get user's status`;
  }

  var today = new Date();

  var joinDate = new Date(userinfoget.joinedAt);
  if (1 == 1) {
   var yearsDiffServerJoin = today.getFullYear() - joinDate.getFullYear();
   var monthsDiffServerJoin = today.getMonth() - joinDate.getMonth();
   var daysDiffServerJoin = today.getDate() - joinDate.getDate();

   if (
    monthsDiffServerJoin < 0 ||
    (monthsDiffServerJoin === 0 && daysDiffServerJoin < 0)
   )
    yearsDiffServerJoin--;
   if (monthsDiffServerJoin < 0) monthsDiffServerJoin += 12;

   if (daysDiffServerJoin < 0) {
    var joinDateAux = joinDate.getDate();
    joinDate.setMonth(joinDate.getMonth() + 1, 0);
    daysDiffServerJoin = joinDate.getDate() - joinDateAux + today.getDate();
    monthsDiffServerJoin--;
   }
   if (daysDiffServerJoin > 7) {
    var weeksDiffServerJoin = (
     (daysDiffServerJoin - (daysDiffServerJoin % 7)) /
     7
    ).toFixed(0);
    daysDiffServerJoin = daysDiffServerJoin - weeksDiffServerJoin * 7;
   } else var weeksDiffServerJoin = 0;

   var hoursDiffServerJoin = (
    ((today - joinDate) / (1000 * 60 * 60)) %
    24
   ).toFixed(0);
   console.log((today - joinDate) / (1000 * 60 * 60));
   var minutesDiffServerJoin = (
    ((today - joinDate) / (1000 * 60)) %
    60
   ).toFixed(0);
   var secondsDiffServerJoin = (((today - joinDate) / 1000) % 60).toFixed(0);
   console.log('hours, mins, secs');
   console.log(hoursDiffServerJoin);
   console.log(minutesDiffServerJoin);
   console.log(secondsDiffServerJoin);

   var result = [];

   if (yearsDiffServerJoin > 0)
    result.push(
     yearsDiffServerJoin + (yearsDiffServerJoin > 1 ? ' years' : ' year')
    );
   if (monthsDiffServerJoin > 0)
    result.push(
     monthsDiffServerJoin + (monthsDiffServerJoin > 1 ? ' months' : ' month')
    );
   if (daysDiffServerJoin > 0)
    result.push(
     daysDiffServerJoin + (daysDiffServerJoin > 1 ? ' days' : ' day')
    );

   console.log(yearsDiffServerJoin);
   console.log(monthsDiffServerJoin);
   console.log(weeksDiffServerJoin);
   console.log(daysDiffServerJoin);

   var highestRoleID = userinfoget.roles.highest.id;
   var joined = moment(userinfoget.joinedAt).format('DD/MM/YY, HH:mm:ss');
   console.log(`Highest role = ${highestRoleID}`);

   console.log(`User = ${userinfoget}`);
   var joinDate = new Date(userinfoget.joinedAt);
   var today = Date.now();
   var timeFromJoiningServer = today - joinDate;
   var yearsServer = (
    timeFromJoiningServer /
    (1000 * 60 * 60 * 24 * 365.25)
   ).toFixed(0);
   var monthsServer;
   console.log(yearsServer);
   console.log(timeFromJoiningServer);
   console.log(userinfoget.joinedAt);

   const embed = new Discord.MessageEmbed()

    .setColor(userinfoget.displayHexColor)
    .setAuthor(`${userinfoget.user.tag}`, userinfoget.user.displayAvatarURL())
    .addFields({ name: `User ping`, value: `<@${userinfoget.id}>` })
    .addFields({ name: `User ID`, value: `${userinfoget.id}` })
    .addFields(
     {
      name: 'Joined Server',
      value:
       moment(userinfoget.joinedAt).format('LLLL') +
       ' ' +
       timeFromJoiningServerMessage,
     } // or moment(userinfoget.joinedAt).format('DD/MM/YY, HH:mm:ss')
    )
    .addFields(
     {
      name: 'Joined Discord',
      value: moment(userinfoget.user.createdAt).format('LLLL'),
     } // or moment(userinfoget.createdAt).format('DD/MM/YY, HH:mm:ss')
    )
    .addFields({ name: 'Highest role', value: `<@&${highestRoleID}>` })
    .addFields({ name: 'Online Status', value: `${status}` })
    .addFields({ name: 'Is a bot?', value: `${isBot}` })
    .setFooter('Bot made by mkpanda');
   message.channel.send(embed);
  }
 },
};
有办法解决吗?我尝试转换 joinDatetoday使用 .getUTCHours 到 UTC 时间(在获得年、月、日和周差异之后)或 .toUTCString ,但第一个导致小时、分钟和秒始终为 0,第二个导致它为 NaN。提前致谢 :)

最佳答案

好吧,事实证明这实际上很容易。我改变了这些行:

   var hoursDiffServerJoin = (
    ((today - joinDate) / (1000 * 60 * 60)) %
    24
   ).toFixed(0);
   console.log((today - joinDate) / (1000 * 60 * 60));
   var minutesDiffServerJoin = (
    ((today - joinDate) / (1000 * 60)) %
    60
   ).toFixed(0);
   var secondsDiffServerJoin = (((today - joinDate) / 1000) % 60).toFixed(0);
进入这个:
var hoursDiffServerJoin = today.getUTCHours() - joinDate.getUTCHours();
var minutesDiffServerJoin = today.getUTCMinutes() - joinDate.getUTCMinutes();
var secondsDiffServerJoin = today.getUTCSeconds() - joinDate.getUTCSeconds();
我认为它以 UTC 格式获取所有值,因此时区不再改变任何内容。

关于javascript - 如何获得服务器加入和今天 discord.js v12 之间的正确时差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63849761/

相关文章:

javascript - 缩小时 Material 会发光(three.js r78)

javascript - 按时间搜索 - MongoDB/NodeJS

ruby - 用 Ruby 计算日期

javascript - Angular:mat-form-field 必须包含一个 MatFormFieldControl

javascript - Ajax 调用 Spring Controller 时出现 400 Bad request 错误

javascript - 将参数函数Node.js从一个js传递到另一个

node.js - 使用 jasmine 和 grunt 测试多个版本的 jquery

java - SimpleDateFormat 奇怪的行为

php - 日期到 Unix 时间 : Why don't this work?

javascript - 使悬停时的图像变暗 - twitter bootstrap 3.0