Флекс, как да намеря седмица от годината за среща?

Не можах да намеря метод в обекта Flex Date, за да получа седмицата от годината (1 до 52)

Кой е най-добрият начин да намерите това? Има ли полезна библиотека за flex за такива операции с дати като JodaTime в Java.


person enesness    schedule 02.03.2010    source източник


Отговори (4)


Не знам за библиотека, но тази функция ще ви изведе седмичния индекс (базиран на нула).

function getWeek(date:Date):Number
{
  var days:Array = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 
  var year:Number = date.fullYearUTC;
  var isLeap:Boolean = (year % 4 == 0) && (year % 100 != 0)
                       || (year % 100 == 0) && (year % 400 == 0); 
  if(isLeap)
    days[1]++;

  var d = 0;
  //month is conveniently 0 indexed.
  for(var i = 0; i < date.month; i++)
    d += days[i];
  d += date.dateUTC;

  var temp:Date = new Date(year, 0, 1);
  var jan1:Number = temp.dayUTC;
  /**
   * If Jan 1st is a Friday (as in 2010), does Mon, 4th Jan 
   * fall in the first week or the second one? 
   *
   * Comment the next line to make it in first week
   * This will effectively make the week start on Friday 
   * or whatever day Jan 1st of that year is.
   **/
  d += jan1;

  return int(d / 7);
}
person Amarghosh    schedule 02.03.2010
comment
Благодаря, но не това имам предвид. Търся седмица от годината, която може да бъде между 1-ва и 52-ра седмица от годината. Например 4 март 2010 г. е 9-та седмица от годината. - person enesness; 02.03.2010
comment
Точно това ще направи тази функция за вас - подайте new Date(2010, 2, 4); на тази функция и вижте какво връща. - person Amarghosh; 02.03.2010
comment
@javanes Упс, имаше грешка във функцията, поправи я. Опитайте сега. - person Amarghosh; 02.03.2010
comment
Предполагам, че логиката трябва да върне Math.ceil(d/7) вместо int. int винаги ще направи датата да попада в предходната седмица, освен ако не приемем, че седмиците започват със седмица 0 - person Rohan; 05.02.2014

Искам само да отбележа, че има грешка в горното решение.

for(var i = 0; i < date.month; i++)

би трябвало

for(var i = 0; i < date.monthUTC; i++)

за да работи правилно.

Все пак благодаря за решението, много ми помогна :)

person Flocoon    schedule 08.11.2010

Преди d да бъде разделено на 7, то трябва да бъде намалено с 1. В противен случай събота ще отиде в следващата седмица.

Вземете 2011 г. като пример, 1/1/2011 е събота. Трябва да е седмица в 0, а 1/8/2011 трябва да е в седмица 1.

Ако d не се намалява, тогава 1+6=7/7=1 и 8+6=14/7=2. Така че тези не са правилни.

person rocksoccer    schedule 13.04.2011

Опитах се да използвам функцията на Amarghosh, но имах проблеми с UTC стойностите. И с първите дни на годината също.

Затова промених настройката на jan1 (в зависимост от неделята) и изчислението на последната седмица

Ето функцията, която използвам, базирана на тази на Amarghosh:

public static function getWeek(date:Date):String
{
    var days:Array = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 
    var year:Number = date.fullYear;
    var isLeap:Boolean = (year % 4 == 0) && (year % 100 != 0)
        || (year % 100 == 0) && (year % 400 == 0); 
    if(isLeap)
        days[1]++;

    var d:Number = 0;

    for(var i:int = 0; i < (date.month); i++){
        d += days[i];
    }

    d += date.date;

    var temp:Date = new Date(year, 0, 1);
    var jan1:Number = temp.day;
    if(jan1 == 0) // sunday
        jan1 = 7;
    d += jan1 - 1;


    var week:int = int((d-1) / 7);

    if(week == 0) // les premiers jours de l'année
        week = 52;

    return (week < 10 ? "0" : "") + week;

}
person Chris    schedule 22.09.2011