Timestamps within Blackberry IPD files follow 3 different date formats depending on
which database they are stored in. At first it seems pretty odd, but then it’s
probably the work of independent programmers/teams working on different
databases and associated software for the device.

### 1. Call Log, Phone History and SMS Date

The date used in these databases is a Java date 8 bytes in
size. Java dates are similar to unix timestamps, with only a multiplier and larger size (8 bytes instead of 4 for unix) for better precision.

Javadate = 1000 * UnixTimestamp

Hence to convert back, simply divide the 8 byte timestamp by
1000 and you get a unix timestamp.

### 2. Calendar Date

This date’s precision is only to the number of minutes. It
is the number of minutes since 1 Jan 1900 0:0:0. Converting this date to
standard unix timestamp (which starts at 1 Jan 1970) means we have to subtract
the difference equivalent to the number of minutes between 1900 and 1970.

Taking into account the 17 leap years also between 1900 and
1970, we calculate the difference.

Difference = (Number of years * Minutes per year) + (Number of Leap Years * Minutes per day)

= (70 * 365 * 24 * 60) + (17 * 24 * 60)

=36816480 minutes

Our simple formula for conversion will be

UnixTimestamp = (CalendarDate – 36816480) * 60

### 3. Email Date

The dates used in email metadata (sent and received dates)
are stored as 2 byte date value and 2 byte time value.

#### 2 byte Date

The date is stored with upper 7 bits representing the year
since 1996, ie, 1 = 1997, 2 = 1998 and so on. The next 4 bits represent the
month (1-12) and the remaining 5 bites represent the day (0-31).

+----------------+----------------+

| BYTE 1
| BYTE 0 |

| 7 6 5 4 3 2 1 0
7 6 5 4 3 2 1 0 |

\___________/ \_____/ \_______/

year month day

#### 2 byte Time

Time is stored with a precision of 2 seconds. That means
that 14:05 will be represented as 14:04 and 14:06 as 14:06. The creators did
not think that this level of fine precision would ever be required for an
email’s metadata date. One reason for this is that you really need 17 bits to
represent all possible values when hours, minutes and seconds are stored separately, 5 bits for hours (0-23), 6 bits
for minutes (0-59) and 6 bits for seconds (0-59). But only 16 bits are
available in 2 bytes, so the BB developers have dropped a bit from the seconds field, hence
only 5 bits are used as shown below.

+----------------+----------------+

| BYTE 1
| BYTE 0 |

| 7 6 5 4 3 2 1 0
7 6 5 4 3 2 1 0 |

\_______/ \_________/ \________/

hour
minute sec