Получите недели в месяце через JavaScript

Потребитель Kafka НЕ является поточно-ориентированным , вы не должны совместно использовать один и тот же экземпляр потребителя между разными потоками. Вместо этого вы должны создать новый экземпляр для каждого потока.

Из документации https://kafka.apache.org/0100/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#multithreaded :

1. Один потребитель на поток

Простой способ - дать каждому потоку свой собственный экземпляр клиента. Вот плюсы и минусы этого подхода:

  • PRO: Реализовать проще всего
  • PRO: Часто он самый быстрый, так как не требуется координация между потоками
  • PRO: очень легко реализовать обработку по порядку для каждого раздела (каждый поток просто обрабатывает сообщения в порядке их получения).
  • CON: Чем больше потребителей, тем больше TCP-соединений с кластером (по одному на поток). В общем, Kafka очень эффективно обрабатывает соединения, поэтому это, как правило, небольшая стоимость.
  • CON: множественные потребители означают, что на сервер отправляется больше запросов и немного меньше пакетных данных, что может вызвать некоторое снижение пропускной способности ввода / вывода.
  • CON: общее количество потоков во всех процессах будет ограничено общим количеством разделов.
blockquote>

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

Kafka не поддерживает параллельную обработку по различным темам. Под этим я подразумеваю, что группы не управляются по разным темам, разделы из разных тем могут быть распределены неравномерно.

16
задан Joe Doyle 1 May 2012 в 00:08
поделиться

5 ответов

Недели начинаются в воскресенье

Это должно работать, даже если февраль не начинается в воскресенье.

function weekCount(year, month_number) {

    // month_number is in the range 1..12

    var firstOfMonth = new Date(year, month_number-1, 1);
    var lastOfMonth = new Date(year, month_number, 0);

    var used = firstOfMonth.getDay() + lastOfMonth.getDate();

    return Math.ceil( used / 7);
}

Недели начинаются в понедельник

function weekCount(year, month_number) {

    // month_number is in the range 1..12

    var firstOfMonth = new Date(year, month_number-1, 1);
    var lastOfMonth = new Date(year, month_number, 0);

    var used = firstOfMonth.getDay() + 6 + lastOfMonth.getDate();

    return Math.ceil( used / 7);
}

Недели начинаются в другой день

function weekCount(year, month_number, startDayOfWeek) {
  // month_number is in the range 1..12

  // Get the first day of week week day (0: Sunday, 1: Monday, ...)
  var firstDayOfWeek = startDayOfWeek || 0;

  var firstOfMonth = new Date(year, month_number-1, 1);
  var lastOfMonth = new Date(year, month_number, 0);
  var numberOfDaysInMonth = lastOfMonth.getDate();
  var firstWeekDay = (firstOfMonth.getDay() - firstDayOfWeek + 7) % 7;

  var used = firstWeekDay + numberOfDaysInMonth;

  return Math.ceil( used / 7);
}
27
ответ дан 30 November 2019 в 15:40
поделиться

Ни одно из решений здесь действительно не работало на меня. Вот моя трещина в нем.

// Example
// weeksOfMonth(2019, 9) // October
// Result: 5
weeksOfMonth (year, monthIndex) {
  const d = new Date(year, monthIndex+ 1, 0)
  const adjustedDate = d.getDate() + d.getDay()
  return Math.ceil(adjustedDate / 7)
}
0
ответ дан 30 November 2019 в 15:40
поделиться

Вы можете использовать мою библиотеку time.js . Вот функция weeksInMonth:

// http://github.com/augustl/time.js/blob/623e44e7a64fdaa3c908debdefaac1618a1ccde4/time.js#L67

weeksInMonth: function(){
  var millisecondsInThisMonth = this.clone().endOfMonth().epoch() - this.clone().firstDayInCalendarMonth().epoch();
  return Math.ceil(millisecondsInThisMonth / MILLISECONDS_IN_WEEK);
},

Это может быть немного неясно, поскольку основа функциональности находится в endOfMonth и firstDayInCalendarMonth, но вы должны хотя бы получить некоторое представление о том, как это работает.

1
ответ дан 30 November 2019 в 15:40
поделиться

Вам нужно будет его вычислить.

Вы можете сделать что-то вроде

var firstDay = new Date(2010, 0, 1).getDay(); // get the weekday january starts on
var numWeeks = 5 + (firstDay >= 5 ? 1 : 0); // if the months starts on friday, then it will end on sunday

Теперь нам просто нужно обобщить это.

var dayThreshold = [ 5, 1, 5, 6, 5, 6, 5, 5, 6, 5, 6, 5 ];
function GetNumWeeks(month, year)
{
    var firstDay = new Date(year, month, 1).getDay();
    var baseWeeks = (month == 1 ? 4 : 5); // only February can fit in 4 weeks
    // TODO: account for leap years
    return baseWeeks + (firstDay >= dayThreshold[month] ? 1 : 0); // add an extra week if the month starts beyond the threshold day.
}

Примечание: При звонке помните, что месяцы в javascript имеют нулевой индекс (т.е. январь == 0).

4
ответ дан 30 November 2019 в 15:40
поделиться
function weeksinMonth(m, y){
 y= y || new Date().getFullYear();
 var d= new Date(y, m, 0);
 return Math.floor((d.getDate()- 1)/7)+ 1;     
}
alert(weeksinMonth(3))

// диапазон месяцев для этого метода - 1 (январь)-12 (декабрь)

3
ответ дан 30 November 2019 в 15:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: