CiviMember SHOULD be calculating End Date for a renewal based on existing End Date for current/non-expired memberships, and based on the new Start Date for expired memberships. We should NOT be using Join Date in either case (and as far as I can tell - we aren't doing so).
The "specified rules" for calculating new End Date on a Membership Renewal are described here with examples:
We think there are some edge cases which aren't being handled properly - and Manish will be setting up a suite of tests to try and catch these. If you (or anyone) has a specific scenario where the End Date is NOT being handled - please post the specifics (membership type properties, inputs, results...)
---- Original post ----
CiviMember sets the end date by calculating off of the join date. I think that this is incorrect and that the calculation should be off of the start date, instead.
Here is how I think the three date fields should be interpreted and used by CiviMember:
1) JOIN date = the date this membership record was created. Consequently, the date a member joined the organization would be the join date on the oldest membership record.
2) START date = the date on which this membership record becomes effective. E.g., if my current membership expires on March 31, I could renew today (join date = March 23) with a start date of April 1.
3) END date = the last date on which this membership record is effective. The end date defaults to being calculated off of the START date, not the join date. Continuing my previous example, the end date would be March 31 of next year.