Как добавить 2 года к дате в Powerbuilder и правильно учесть високосный год? - PullRequest
4 голосов
/ 05 января 2010

Как добавить 2 года к дате в энергетике и правильно учесть високосный год?

У нас есть медицинская лицензия, в которой пользователь хотел бы, чтобы срок действия истекал через два года. Дата текущей лицензии - 7/10/2010, а дата истечения срока действия должна быть 7/2/2012. Я использовал относительную дату и добавил 729, если не високосный год, и 730, если это было, но это грязно.

Хотелось бы, чтобы функция относительной даты приняла другой параметр, чтобы вы могли передать число лет.

Ответы [ 4 ]

2 голосов
/ 06 января 2010

Как насчет:

// adjusted from suggestions
IF Month (ldt_OldDate) = 2 AND Day (ldt_OldDate) = 29 THEN
   ldt_NewDate = Date (Year(ldt_OldDate) + 2, 3, 1) 
   // or ... 2, 28) whichever you think is two years from Feb 29
ELSE
   ldt_NewDate = Date (Year(ldt_OldDate) + 2, Month (ldt_OldDate), Day (ldt_OldDate))
END IF

Удачи,

Terry

1 голос
/ 09 января 2010

Если вы используете PFC, вы можете сделать:

n_cst_datetime     luo_dateTime   

ld_calculate_date_to = luo_dateTime.of_relativeYear(ldt_calculate_date, 2)
0 голосов
/ 27 июня 2010

Вот более многократно используемое решение - и может сделать намного больше, чем вам нужно - это глобальная функция - или для любителей nvo вы можете выбрать одно из них:

>

/ * ЧТО ЭТО ДЕЛАЕТ

передать дату и дни, месяцы, годы, которые вы хотели бы добавить к ней и он возвращает новую дату

1010 * ИСПОЛЬЗОВАНИЕ *

Вы можете отправить любое число в ai_days ai_months ai_years, включая отрицательные числа и месяцев больше 12 (например, ai_months = -18 означает 18 месяцев в прошлом)

АРГУМЕНТЫ

дата adt_change - пройти и вернуться с измененной датой

intger ai_days

целое число ai_months

целое число ai_years

возвращаемое целое число

* /

1028 * попробовать *

целое число li_add_years

целое число li_new_day

целое число li_new_month

целое число li_new_year

целое число li_total_months

добавить дни

если ai_days <> 0, то adt_change = относительный срок (adt_change, ai_days)

если isnull (adt_change), тогда бросить STOP конец если

сохранить измененные день, месяц и год

li_new_day = день (adt_change)

  if isnull(li_new_day) then throw STOP

li_new_month = месяц (adt_change)

  if isnull(li_new_month) then throw STOP

li_new_year = год (adt_change)

  if isnull(li_new_year) then throw STOP

изменить месяц

если ai_months <> 0, то

  li_total_months = li_new_month + ai_months

  li_new_month = mod(li_total_months,12)

      if isnull(li_new_month) then throw STOP

  li_add_years = int(li_total_months/12)  

      if isnull(li_add_years) then throw STOP

  if li_total_months <=0 then li_new_month += 12      

конец, если

изменить год

li_new_year + = li_add_years + ai_years

дата сброса

adt_change = date (li_new_year, li_new_month, li_new_day)

  if adt_change = 1900-01-01 or isnull(adt_change) then 

бросить стоп

возврат УСПЕХ

catch (runtimeerror lrteo_error)

return logerror (lrteo_error)

конец попытки

0 голосов
/ 06 января 2010

Это был код, который я использовал:

//Get the license Issue Date
  ldt_calculate_date = this.GetItemDateTime(1, 'issue_date')

//Add two years to the date
  ld_calculate_date = date(ldt_calculate_date)
    ld_NewDate = Date ((Year(ld_calculate_date) + 2), Month (ld_calculate_date), Day 
        (ld_calculate_date))

//Subtract 1 from the date for correct expiration
  ld_calculate_date_to = date(RelativeDate(ld_NewDate, -1))

//Set expiration date on my datawindow
  setitem(1,"expiration_date", ld_calculate_date_to)
...