Millis help please!

Sloppsta:
But it always start at say 5 seconds because previousmillis was 0 at the time.

I think (but you didn't show your code yet) that's because you need to capture the time at which the button became pressed. See code below, where I used a state machine approach. Works for me.

(Note the button is to ground with internal pullup enabled; the button is thus "active low". In the IDLE state, where it goes right at the start, it only looks for the button's state to go low (the if (!buttonState)), at which point it goes to the COUNTING state.)

byte buttonPin = 2;
bool buttonState;
bool timing = false;
unsigned long previousMillis;
unsigned long currentMillis;
unsigned long timingStartedAt;
int timingInterval = 100;
enum {IDLE, COUNTING} currentState = IDLE;

void setup()
{
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("Setup done");
  Serial.println("Entering Idle state");
  Serial.println("Press button to count");
  Serial.println("---------------------");
  Serial.println("");

}//setup

void loop()
{
  currentMillis = millis();
  buttonState = digitalRead(buttonPin);

  switch (currentState)
  {
    case IDLE:
      //Serial.println("Idle");
      if (!buttonState) //pressed
      {
        currentState = COUNTING;
      }
      break;

    case COUNTING:

      if (!timing) //first time here, so initialise
      {
        timing = true;
        timingStartedAt = currentMillis;
        previousMillis = currentMillis;
      }

      if (timing)
      {
        if (currentMillis - previousMillis >= timingInterval)
        {
          Serial.println(currentMillis - timingStartedAt);
          previousMillis = currentMillis;
        }
      }

      if (buttonState) //button has been released
      {
        currentState = IDLE;
        Serial.println("Returning to Idle state");
        Serial.println(" Press button to count");
        Serial.println("-----------------------");
        timing = false;
      }
      break;
  }//switch

}//loop

The "enum" by the way, is just a simple way of assigning a number to word, starting with 0 at the left of the list. So there, IDLE has the value 0, and COUNTING is 1; both of those are used in the switch... case as the normal 0 and 1, but more meaningful and human friendly.