It should only return a negative value if the date is before 00:00:00 GMT on January 1st 1970. This date time is also called the epoch - see java.util.Calendar for more info. This point of time is represented as 0 in Java's calendars and dates (among others; PHP also uses it). Any time before that is always negative.
That still does not explain why a few weeks ago is negative. Can you tell us what values you are using when creating the GregorianCalendar?