Tibetan Calendar Converter
Tibetan Calendar Converter
Convert Tibetan calendar years into their Western (Common Era or A.D.) equivalents. (Scroll down for details.)
1. Select an Animal
 English  Tibetan   Phonetic  Wylie 
Hare yos
Dragon druk 'brug
Snake trü sbrul
Horse ta rta
Sheep luk lug
Monkey tre spre
Bird ja bya
Dog khyi khyi
Pig pak phag
Rat tsi tsi
Ox lang glang
Tiger tak stag
2. Select an Element
 English  Tibetan   Phonetic  Wylie 
Fire me me
Earth sa sa
Iron chak lcags
Water chu chu
Wood shing zhing
3. Select a Rabjung Cycle
If "Unknown", a set of possible Western years will be returned.

The Details

A Tibetan year is properly identified by three essential parts. The first two, the Animal and Element, correspond roughly to similar identifiers used in the Chinese calendar. The third part is the Rabjung (rab byung, rab byung). The Rabjung are 60-year cycles, the first of which began in 1027 C.E. We are currently in the 17th Rabjung, which began on February 28, 1987.

Unfortunately, pre-modern Tibetan literature doesn't always identify dates with all three of these parts — often only the animal and element are explicitly mentioned (and sometimes not even these are given — there are other systems for identifying Tibetan dates. I am still researching these; if you have insights or suggestions for further reading then please send me a note). However, if you can narrow the author's dates to within a century or so, then it's not hard to figure out the rabjung for yourself.

Each year of a Rabjung cycle spans two Western years. This is because the Tibetan New Year or Losar (lo gsar, lo gsar) falls in either February or March.

It is possible to reverse the calculation, to convert Western years into their Tibetan equivalents, but I regard the results as somewhat misleading on account of the difficulty of determining when Losar falls. I have so far been unable to find an algorithm for arbitrarily determining the date of Losar for any given year; if you know of one, please let me know! You will find a table of Tibetan New Years from 1880 to 1997 in Philippe Cornu's Tibetan Astrology (Boston: Shambhala, 1997), pp. 157-170.

This calculator is based on an algorithm published by Peter Meyer. You may read details about the algorithm at http://hermetic.nofadz.com/cal_stud/tib_year.htm. There is quite a wealth of interesting calendrical, and other information, on that website.

I created this calculator because I discovered that, although there is a lot of Tibetan astrological information available on the Internet, there is very little out there to help students of history (or dilettantes like myself) puzzle their way through the quagmire of the Tibetan calendrical system. One of the more informative resources I found was www.nitartha.org/calendar_overview.html.

The Gory Details

The calculation is performed by a very simple PHP script. Here is the code (feel free to use and alter it any way you wish):

<html><body>
<?php

# First, set up the arrays that will be used to generate output and the tables on the user form:

$animals_english = array("Hare","Dragon","Snake","Horse","Sheep","Monkey","Bird","Dog","Pig","Rat","Ox","Tiger");
$animals_phonetic = array("yö","druk","trü","ta","luk","tre","ja","khyi","pak","tsi","lang","tak");
$animals_wylie = array("yos","'brug","sbrul","rta","lug","spre","bya","khyi","phag","tsi","glang","stag");

$elements_english = array("Fire","Earth","Iron","Water","Wood");
$elements_phonetic = array("me","sa","chak","chu","shing");
$elements_wylie = array("me","sa","lcags","chu","zhing");

# Next, take the variables from the CGI query and perform the calculation.
# The three variables are
#    $animal
#    $element
#    $cycle
# Both $animal and $element are required fields, so we assume if they are set then we are
# getting a request from the form.
# Otherwise we assume that we are not receiving a CGI query; skip this section and just
# print out the form.

if( isset($animal) && isset($element) ) {

   # This determines which year of the 60-year cycle the given animal/element
   # combination refers to. (Formula courtesy of Peter Meyer.)
   if( ((2 * $element) >= $animal) && ($animal % 2 == 0) )
      $j = 1;
   else if( ((2 * $element) < $animal) && ($animal % 2 == 0) )
      $j = 61;
   else if( ((2 * $element) > $animal) && ($animal % 2 > 0) )
      $j = -5;
   else if( ($element == 0) && ($animal == 11) )
      $j = 115;
   else $j = 55;
   $year_of_cycle = (12 * $element) - (5 * $animal) + $j;

   echo "<h2>Results</h2>\n";

   # $cycle ("Rabjung") is an optional variable. If it is not set, then we return all
   # the possible years that the given animal/element combination refers to.
   # If $cycle IS set, then only one year is possible.

   if( isset($cycle) && ($cycle > 0) ){
      # The year in the Western system is determined by the following formula (courtesy of Peter Meyer.)
      $year_ce = $year_of_cycle + (60 * $cycle) + 966;

      # Nicely print the result:
      echo "The Tibetan <b>$elements_english[$element] $animals_english[$animal]</b> year of the $cycle";
      switch( $cycle ){
         case 1:  echo "<sup>st</sup>"; break;
         case 2:  echo "<sup>nd</sup>"; break;
         case 3:  echo "<sup>rd</sup>"; break;
         default: echo "<sup>th</sup>";
      }
      echo " Rabjung corresponds to " .
      	"<b>" . $year_ce . "-" . ($year_ce + 1) . "</b>" .
      	" of the Common Era.";
   }
   else {
      echo "The Tibetan <b>$elements_english[$element] $animals_english[$animal]</b> year " .
         "corresponds to the following Common Era years:<br>\n";
      echo "<table border='0'>\n";
      echo "<tr valign='top'>\n<td>";

      # The Western-year calculation must be performed in a loop, for all possible Rabjung.
      # We decide to handle only the first 18 Rabjung (but make sure to fix this before
      # 2107, or the program will be obsolete!)
      for( $i=1; $i<19; ++$i ){
         # This just formats the results as a two-column list:
         if( (($i-1) % 9) == 0 )
            echo "</td>\n<td width='10'></td>\n<td>\n";

         $year_ce = $year_of_cycle + (60 * $i) + 966;
         echo "  $year_ce-" . ($year_ce + 1) . " (";
         echo $i;
         switch( $i ){
            case 1:  echo "<sup>st</sup>"; break;
            case 2:  echo "<sup>nd</sup>"; break;
            case 3:  echo "<sup>rd</sup>"; break;
            default: echo "<sup>th</sup>";
         }
         echo " Rabjung)<br>";
      }
      echo "</td>\n</tr>\n</table>\n";

   }
   echo "<hr>\n";
}

# Finally, we print out the form. If the script was called without CGI variables,
# then this is all that the user sees.
# You could just use HTML to create the form, but since it consist of repeating
# elements I chose to set it up using PHP arrays and loops.

?>
Convert Tibetan calendar years into their Western (<i>Common Era</i> or <i>A.D.</i>) equivalents.
<form>
   <table border="0">
      <caption align="left" valign="top">1. Select an Animal</caption>
      <th></th><th>English</th><th>Phonetic</th><th>Wylie</th>
<?php
for( $i=0; $i<count($animals_english); ++$i ){
   echo "<tr>\n";
   echo "   <td><input type='radio' name='animal' value='$i' ";
   if( isset($animal) ){
      if( ($animal == $i) )
         echo "checked";
   }
   else
      if( $i == 0 ) echo "checked";
   echo "></td>\n";
   echo "<td>$animals_english[$i]</td>\n";
   echo "<td>$animals_phonetic[$i]</td>\n";
   echo "<td>$animals_wylie[$i]</td>\n";
   echo "</tr>\n";
}
?>
   </table>
   <table border="0">
      <caption align="left" valign="top">2. Select an Element</caption>
      <th></th><th>English</th><th>Phonetic</th><th>Wylie</th>
<?php
for( $i=0; $i<count($elements_english); ++$i ){
   echo "<tr>\n";
   echo "   <td><input type='radio' name='element' value='$i' ";
   if( isset($element) ){
      if( ($element == $i) )
         echo "checked";
   }
   else
      if( $i == 0 ) echo "checked";
   echo "></td>\n";
   echo "<td>$elements_english[$i]</td>\n";
   echo "<td>$elements_phonetic[$i]</td>\n";
   echo "<td>$elements_wylie[$i]</td>\n";
   echo "</tr>\n";
}
?>
   <table border="0">
      <caption class="bold" align="left" valign="top">3. Select a Rabjung Cycle</caption>
         <tr><td>
            <select name="cycle">
<?php
# Create a drop-down list that accomodates up to the 18th rabjung, which begins in 2047
for( $i=0; $i<19; ++$i ){
   echo "<option value=$i ";
   if( isset($cycle) ){
      if( $cycle == $i ) echo "selected";
   }
   else if( $i==0 )
      echo "selected";
   echo ">";
   if( $i == 0 )
      echo "Unknown";
   else {
      echo "$i (" . (967 + (60*$i)) . " - " . (967 + (60*$i) + 60) . " C.E.)";
   }
   echo "</option>\n";
}
?>
            </select>
         </td></tr>
      <caption align="left" valign="bottom">If "Unknown", a set of possible Western years will be returned.</caption>
   </table>
   <p>
   <input type="submit" value="Convert">
</form>
</body></html>