Ok, here is my updated script. It now has formatting options. You can choose which items to display and even throw in some color codes or other formatting if you choose. This also will automatically adjust the output to show the right duration even if you remove an item from the display.

Example (if you do this in July):

$datexpander(4wks 3days) = 1 month, and 1 day
$datexpander(4wks 3days,d) = 31 days

(i.e. It doesn't just show 3 days). It's interesting with only seconds displayed... of course, the output is limited by mIRC's number size limits.

I've also in the process made some changes to how things are handled.

Suggestions, comments, etc?

Code:
; *******************************************************************
; DateXpander Script
; by Riamus 2005
;
; Suggestions and ideas for improvement from mIRC.com's forum
;
; This script will take a standard $duration and make it include months and years
; based on the current date.
;
; For this script to be accurate, it is only meant to be used when the $duration is
; using today's date and counting backwards (such as an uptime $duration). It
; will still be really accurate (within 3 days) even if you use a $duration that isn't
; from the current date, but it won't be exact that way.
;
; Use: $DateXpander(value,format)
; "value" must be in the format of $duration
; "format" uses y = years, m = months, w = weeks, d = days, h = hours, n = minutes, s = seconds
; "format" can also contain other information such as colors.  Zero pad your colors!
; Note that commas are automatically inserted.  Any other formatting can be done
; manually with this.
;
; For questions about this script, contact Riamus on IRC -- #oldgames on irc.undernet.org
; *******************************************************************

alias DateXpander {
  unset %dx-dateoutput

  if ($1 isalpha || $1 isnum) {
    echo -a Error.  Use the same format as in $chr(36) $+ duration.
    halt
  }

  set %dx_weeks $iif($gettok($1-,1,119) isnum,$gettok($1-,1,119),0)
  set %dx_days $iif($gettok($gettok($1-,1,100),-1,32) isnum,$gettok($gettok($1-,1,100),-1,32),0)
  set %dx_hours $iif($gettok($gettok($1-,1,104),-1,32) isnum,$gettok($gettok($1-,1,104),-1,32),0)
  set %dx_minutes $iif($gettok($gettok($1-,1,109),-1,32) isnum,$gettok($gettok($1-,1,109),-1,32),0)
  set %dx_seconds $iif(sec isin $gettok($1-,$gettok($1-,0,32),32),$gettok($gettok($1-,$gettok($1-,0,32),32),1,115),0)
  set %dx_totaldays $calc(%dx_weeks * 7 + %dx_days)
  set %dx_outputdays %dx_totaldays

  set %dx_currentmonth $date(m)

  :monthstart
  if ($istok(12.10.7.5,%dx_currentmonth,46)) {
    set %dx_monthdays 30
  }
  elseif ($istok(11.9.8.6.4.2.1,%dx_currentmonth,46)) {
    set %dx_monthdays 31
  }
  elseif (%dx_currentmonth == 3 && $calc($date(yyyy) % 4) != 0) {
    set %dx_monthdays 28
  }
  elseif (%dx_currentmonth == 3 && $calc($date(yyyy) % 4) == 0) {
    set %dx_monthdays 29
  }
  if (%dx_totaldays >= %dx_monthdays) {
    inc %dx_months
    dec %dx_totaldays %dx_monthdays
    if (%dx_currentmonth != 1) {
      dec %dx_currentmonth
    }
    else { set %dx_currentmonth 12 }
    inc %dx_totalmonths
    inc %dx_monthsdays %dx_monthdays
    if (%dx_totalmonths == 12) {
      inc %dx_yeardays %dx_monthsdays
      unset %dc_monthsdays
      unset %dx_totalmonths
    }
    goto monthstart
  }

  set %dx_years $int($calc(%dx_months / 12))
  dec %dx_months $calc(%dx_years * 12)
  set %dx_weeks $int($calc(%dx_totaldays / 7))
  set %dx_totaldays $calc(%dx_totaldays % 7)

  if ($2) {
    if (y !isin $2 && %dx_years > 0) {
      set %dx_months $calc(%dx_months + (%dx_years * 12))
      set %dx_years 0
    }
    if (m !isin $2 && %dx_months > 0) {
      set %dx_weeks $iif(%dx_years == 0,$int($calc((%dx_outputdays) / 7)),$int($calc((%dx_outputdays - %dx_yeardays) / 7)))
      set %dx_totaldays $iif(%dx_years == 0,$calc((%dx_outputdays) % 7),$calc((%dx_outputdays - %dx_yeardays) % 7))
    }
    if (w !isin $2 && %dx_weeks > 0) {
      set %dx_totaldays $calc(%dx_totaldays + (%dx_weeks * 7))
    }
    if (d !isin $2 && %dx_days > 0) {
      set %dx_hours $calc(%dx_hours + (%dx_days * 24))
    }
    if (h !isin $2 && %dx_hours > 0) {
      set %dx_minutes $calc(%dx_minutes + (%dx_hours * 60))
    }
    if (n !isin $2 && %dx_minutes > 0) {
      set %dx_seconds $calc(%dx_seconds + (%dx_minutes * 60))
    }
    set %dateoutput $replacex($2,y,$bytes(%dx_years,b) $iif(%dx_years == 1,year $+ $chr(44) $+ $chr(32),years $+ $chr(44) $+ $chr(32)),m,$bytes(%dx_months,b) $iif(%dx_months == 1,month $+ $chr(44) $+ $chr(32),months $+ $chr(44) $+ $chr(32)),w,$bytes(%dx_weeks,b) $iif(%dx_weeks == 1,week $+ $chr(44) $+ $chr(32),weeks $+ $chr(44) $+ $chr(32)),d,$bytes(%dx_totaldays,b) $iif(%dx_totaldays == 1,day $+ $chr(44) $+ $chr(32),days $+ $chr(44) $+ $chr(32)),h,$bytes(%dx_hours,b) $iif(%dx_hours == 1,hour $+ $chr(44) $+ $chr(32),hours $+ $chr(44) $+ $chr(32)),n,$bytes(%dx_minutes,b) $iif(%dx_minutes == 1,minute $+ $chr(44) $+ $chr(32),minutes $+ $chr(44) $+ $chr(32)),s,$bytes(%dx_seconds,b) $iif(%dx_seconds == 1,second $+ $chr(44) $+ $chr(32),seconds $+ $chr(44) $+ $chr(32)))
    set %dateoutput $left(%dateoutput,-1)
    if ($gettok(%dateoutput,0,32) > 2) {
      set %dateoutput $instok(%dateoutput,$chr(32) $+ and,-2,32)
    }
  }

  unset %dx_*

  return %dateoutput
}