Преобразование меток времени c # в метки времени javascript - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть скрипт ac #, в котором я создаю метку времени для текущего года, текущего месяца, текущей недели и текущего дня.

DateTime now = DateTime.UtcNow;

now = new DateTime(now.Year, 1, 1);
int yearDay = (int)(now.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

now = new DateTime(now.Year, now.Month, 1);
int monthDay = (int)(now.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

now = DateTime.UtcNow.StartOfWeek(DayOfWeek.Monday);
int weekDay = (int)(now.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

now = new DateTime(now.Year, now.Month, now.Day);
int toDay = (int)(now.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

Теперь я хочу сделать то же самое, но в JavaScript ...у меня есть год, но я не знаю, как получить месяц, неделю и день.

var d = new Date();

// YEAR TIMESTAMP //
var thisYear = d.getUTCFullYear();
var y = Date.UTC(thisYear, 0, 1, 0, 0, 0, 0);
var yearDay = Math.floor(y / 1000);

Надеюсь, что кто-то может мне помочь в этом вопросе, и спасибо заранее: -)


Я также получил месяц как этот, но все еще должен выяснить, как я получаю текущий день и неделю.

// MONTH TIMESTAMP //
var thisMonth = d.getUTCMonth();
var m = Date.UTC(thisYear, thisMonth, 1, 0, 0, 0, 0);
var monthDay = Math.floor(m / 1000);

// C# toDay output: 1548979200
// C# weekDay output: 1548633600

Попробовал это для toDay, но вывод не такой, как в C #:

// DAY TIMESTAMP //
var thisDay = d.getUTCDay();
var da = Date.UTC(thisYear, thisMonth, thisDay, 0, 0, 0, 0);
var toDay = Math.floor(da / 1000);

// output: 1549324800

Все еще надеемся на помощь: -)

********* РЕДАКТИРОВАТЬ 2 ***********

ОКЯ, наконец, получил правильный день:

// DAY TIMESTAMP //
var da = Date.UTC(thisYear, thisMonth, thisDay, 0, 0, 0, 0);
var toDay = Math.floor(da / 1000);

Теперь, что осталось, как я могу получить правильную неделю.

Я пробовал это:

// WEEK TIMESTAMP //
var w = Date.UTC(thisYear, thisMonth, d.setDate(d.getDate() - (d.getDay() || 7) + 1), 0, 0, 0, 0);
var weekDay = Math.floor(w / 1000);

Это выводит NaN.Есть идеи, как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Чтобы получить понедельник в начале недели, вы можете вычесть номер дня и добавить один.Воскресенье - 0, поэтому, чтобы получить предыдущий понедельник, измените его номер дня на 7.

Вы неправильно используете код, d.setDate(...) возвращает значение времени скорректированной даты, которое вы и хотите.Вам не нужно ничего делать дальше.Однако, поскольку вы используете значения UTC, здесь это в вашем контексте.

Я изменил имена переменных, чтобы включить UTC как подсказку к их значениям.Также методы «Date» возвращают номер дня в месяце, а методы «Day» возвращают номер дня в неделе.

var d = new Date();
var utcYear = d.getUTCFullYear();
// Only year and month need to be set, missing values will default to minimums
var yearDay = Math.floor(Date.UTC(utcYear, 0) / 1000);

// MONTH TIMESTAMP //
var utcMonth = d.getUTCMonth();
var monthDay = Math.floor(Date.UTC(utcYear, utcMonth) / 1000);

// DAY TIMESTAMP // - changed "Day" to "Date"
var utcDate = d.getUTCDate();
var toDay = Math.floor(Date.UTC(utcYear, utcMonth, utcDate) / 1000);

// WEEK TIMESTAMP //
var w = new Date(Date.UTC(utcYear, utcMonth, utcDate));

// Set w to Monday at start of week
w.setUTCDate(w.getUTCDate() - (w.getUTCDay() || 7) + 1);

var weekDay = Math.floor(w / 1000);

console.log(yearDay, monthDay, toDay, weekDay);
0 голосов
/ 01 февраля 2019

Вы уже извлекли Date ссылку на MDN?

Существуют методы для получения этой информации.

// Vanilla JS
var utcDate = new Date();
console.log({
  yearDay: utcDate.getUTCFullYear(),
  monthDay: utcDate.getUTCMonth(),
  weekDay: utcDate.getUTCDay(),
  toDay: utcDate.getUTCDate(),
  hour: utcDate.getUTCHours(),
  min: utcDate.getUTCMinutes(), 
  sec: utcDate.getUTCSeconds(),
  ms: utcDate.getUTCMilliseconds()
});

// Moment
var utcMoment = moment.utc();
console.log({
  yearDay: utcMoment.year(),
  monthDay: utcMoment.month(),
  weekDay: utcMoment.isoWeekday(),
  toDay: utcMoment.date(), // Day of month or utcMoment.dayOfYear(),
  hour: utcMoment.hours(),
  min: utcMoment.minutes(), 
  sec: utcMoment.seconds(),
  ms: utcMoment.milliseconds()
});
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://momentjs.com/downloads/moment.min.js"></script>

Обновление

Если вы хотите получить дату определенного дня недели, вы можете клонироватьdate, рассчитайте разницу в днях и сложите / вычтите это количество дней из текущей даты.

const TimeUnit = {
  YEARS : {
    add : function(date, amount, utc) {
      if (utc) date.setUTCFullYear(date.getUTCFullYear() + amount);
      else date.setUTCFullYear(date.getUTCFullYear() + amount);
      return date;
    }
  },
  MONTHS : {
    add : function(date, amount, utc) {
      if (utc) date.setUTCMonth(date.getUTCMonth() + amount);
      else date.setMonth(date.getMonth() + amount);
      return date;
    }
  },
  DAYS : {
    add : function(date, amount, utc) {
      if (utc) date.setUTCDate(date.getUTCDate() + amount);
      else date.setDate(date.getDate() + amount);
      return date;
    }
  },
  HOURS : {
    add : function(date, amount, utc) {
      if (utc) date.setUTCHours(date.getUTCHours() + amount);
      else date.setHours(date.getHours() + amount);
      return date;
    }
  },
  MINUTES : {
    add : function(date, amount, utc) {
      if (utc) date.setUTCMinutes(date.getUTCMinutes() + amount);
      else date.setMinutes(date.getMinutes() + amount);
      return date;
    }
  },
  SECONDS : {
    add : function(date, amount, utc) {
      if (utc) date.setUTCSeconds(date.getUTCSeconds() + amount);
      else date.setSeconds(date.getSeconds() + amount);
      return date;
    }
  },
  MILLISECONDS : {
    add : function(date, amount, utc) {
      if (utc) date.setUTCMilliseconds(date.getUTCMilliseconds() + amount);
      else date.setMilliseconds(date.getMilliseconds() + amount);
      return date;
    }
  }
};

function addTime(date, timeUnit, amount, utc) {
  return timeUnit.add(date, amount, utc);
}

function getDateForCurrentWeek(date, dayOfWeek, utc) {
  var clone = new Date(date.getTime());
  var currentDay = (utc ? clone.getUTCDay() : clone.getDay()) || 7;
  var diff = dayOfWeek - currentDay + 1;
  return addTime(clone, TimeUnit.DAYS, diff, utc);
}

function printDate(targetEl, date, utc) {
  targetEl.value = JSON.stringify(utc ? {
    year: date.getUTCFullYear(),
    month: date.getUTCMonth() + 1,
    dayOfWeek: date.getUTCDay(),
    date: date.getUTCDate(),
    hour: date.getUTCHours(),
    min: date.getUTCMinutes(), 
    sec: date.getUTCSeconds(),
    ms: date.getUTCMilliseconds()
  } : {
    year: date.getFullYear(),
    month: date.getMonth() + 1,
    dayOfWeek: date.getDay(),
    date: date.getDate(),
    hour: date.getHours(),
    min: date.getMinutes(), 
    sec: date.getSeconds(),
    ms: date.getMilliseconds()
  }, null, 2);
}

function setDayOfWeekValue(selector, date, dayOfWeek, utc) {
  document.querySelector(selector).value = getDateForCurrentWeek(date, dayOfWeek, utc);
}

var utcDate = new Date();
setDayOfWeekValue('.day-sun', utcDate, 0, true);
setDayOfWeekValue('.day-mon', utcDate, 1, true);
setDayOfWeekValue('.day-tue', utcDate, 2, true);
setDayOfWeekValue('.day-wed', utcDate, 3, true);
setDayOfWeekValue('.day-thu', utcDate, 4, true);
setDayOfWeekValue('.day-fri', utcDate, 5, true);
setDayOfWeekValue('.day-sat', utcDate, 6, true);

// Test adding 1 unit to each date portion.
printDate(document.getElementById('result-1'), utcDate, true);
utcDate = addTime(utcDate, TimeUnit.YEARS, 1, true);
utcDate = addTime(utcDate, TimeUnit.MONTHS, 1, true);
utcDate = addTime(utcDate, TimeUnit.DAYS, 1, true);
utcDate = addTime(utcDate, TimeUnit.HOURS, 1, true);
utcDate = addTime(utcDate, TimeUnit.MINUTES, 1, true);
utcDate = addTime(utcDate, TimeUnit.SECONDS, 1, true);
utcDate = addTime(utcDate, TimeUnit.MILLISECONDS, 1, true);
printDate(document.getElementById('result-2'), utcDate, true);
.days-of-week .day-of-week {
  margin-bottom: 0.25em;
}
.days-of-week label {
  display: inline-block;
  font-weight: bold;
  width: 3em;
}
.days-of-week input[class^="day-"] {
  font-family: monospace;
  width: 80vw;
}
<div class="days-of-week">
  <div class="day-of-week"><label>Sun</label><input type="text" class="day-sun" /></div>
  <div class="day-of-week"><label>Mon</label><input type="text" class="day-mon" /></div>
  <div class="day-of-week"><label>Tue</label><input type="text" class="day-tue" /></div>
  <div class="day-of-week"><label>Wed</label><input type="text" class="day-wed" /></div>
  <div class="day-of-week"><label>Thu</label><input type="text" class="day-thu" /></div>
  <div class="day-of-week"><label>Fri</label><input type="text" class="day-fri" /></div>
  <div class="day-of-week"><label>Sat</label><input type="text" class="day-sat" /></div>
</div>

<textarea id="result-1" rows="12" cols="32"></textarea>
<textarea id="result-2" rows="12" cols="32"></textarea>
...