First Project Help Needed (Single Digit, Seven Seg Display, Clock, No Hardware)

Ok, I have been lurking for awhile and I finally have an arduino to play with and join in on the fun. I started working with the shift register that came with my kit and I just kept going down the rabbit hole of fun.... which led me to where I am now.

This is probably a total mess, but it works all the way up until 20 secs each minute. It blinks the minute (not set up to go past 9 minutes yet), then the seconds. At the current rate it flashes 0-1, 0-6, 1-2, 1-8, and then 1-2-4 (instead of 2-4) and does the same in the 30's 1-2-3-then single digit.

The bulk of the code is based on the arduino Time library example, with some shift register cobbling, array cobbling, and a few hail mary's.

counting to 9 was a victory for me, but going past that has proved a bit out of my current range. So any help is appreciated, both fixes to the current code and code the way that it should be done are appreciated.

#include <Time.h>  

#define TIME_MSG_LEN  11   // time sync to PC is HEADER followed by unix time_t as ten ascii digits
#define TIME_HEADER  'T'   // Header tag for serial time sync message
#define TIME_REQUEST  7    // ASCII bell character requests a time sync message 
 int data = 2; 
int clock = 3;
int latch = 4;
 int ledclear = B00000000;
 int number0 = B10110111;
 int number1 = B00010100; 
 int number2 = B10101101;
 int number3 = B10011101;
 int number4 = B00011110;
 int number5 = B10011011;
 int number6 = B10111010;
 int number7 = B00010101;
 int number8 = B10111111;
 int number9 = B00011111;
 int value[10];
 
void setup()  {
    pinMode(data, OUTPUT);
  pinMode(clock, OUTPUT);  
  pinMode(latch, OUTPUT);
value[0] = number0; 
value[1] = number1;
value[2] = number2;
value[3] = number3;
value[4] = number4;
value[5] = number5;
value[6] = number6;
value[7] = number7;
value[8] = number8;
value[9] = number9;

  Serial.begin(9600);
  setSyncProvider( requestSync);  //set function to call when sync required
  Serial.println(" for sync message");
}

void loop(){    
  if(Serial.available() ) 
  {
    processSyncMessage();
  }
 
  if(timeStatus()!= timeNotSet)   
  {
    digitalWrite(13,timeStatus() == timeSet); // on if synced, off if needs refresh  
    digitalClockDisplay();  
  }
  delay(3000);
}

void digitalClockDisplay(){

  // digital clock display of the time
  Serial.print(hour());
  
  
  printDigits(minute());
 int k = minute();
   if( k < 10 )
  {
  digitalWrite(latch, LOW);
  shiftOut(data, clock, MSBFIRST, value[0]);
  digitalWrite(latch, HIGH);
 
   delay(400);
      digitalWrite(latch, LOW);
  shiftOut(data, clock, MSBFIRST, ledclear);
  digitalWrite(latch, HIGH);
  delay(200);
    digitalWrite(latch, LOW);
  shiftOut(data, clock, MSBFIRST, value[k]);
  digitalWrite(latch, HIGH);
    }
     delay(400);
      digitalWrite(latch, LOW);
  shiftOut(data, clock, MSBFIRST, ledclear);
  digitalWrite(latch, HIGH);
    delay(200);
  printDigits(second());
   int val = second();
 int units = val;



   if( units < 10 )
  {
  digitalWrite(latch, LOW);
  shiftOut(data, clock, MSBFIRST, value[0]);
  digitalWrite(latch, HIGH);
 
   delay(400);
      digitalWrite(latch, LOW);
  shiftOut(data, clock, MSBFIRST, ledclear);
  digitalWrite(latch, HIGH);
  delay(150);
    digitalWrite(latch, LOW);
  shiftOut(data, clock, MSBFIRST, value[val]);
  digitalWrite(latch, HIGH);
  }
  else
  while(units >= 10){
int tens = tens + 1;
units = units - 10;
    digitalWrite(latch, LOW);
  shiftOut(data, clock, MSBFIRST, value[tens]);
  digitalWrite(latch, HIGH);
  delay(400);
  digitalWrite(latch, LOW);
  shiftOut(data, clock, MSBFIRST, ledclear);
  digitalWrite(latch, HIGH);
  delay(150);
   digitalWrite(latch, LOW);
  shiftOut(data, clock, MSBFIRST, value[units]);
  digitalWrite(latch, HIGH);
  }
    
delay(400);

   digitalWrite(latch, LOW);
  shiftOut(data, clock, MSBFIRST, ledclear);
  digitalWrite(latch, HIGH);
  delay(400);
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
   
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

void processSyncMessage() {
  // if time sync available from serial port, update time and return true
  while(Serial.available() >=  TIME_MSG_LEN ){  // time message consists of a header and ten ascii digits
    char c = Serial.read() ; 
    Serial.print(c);  
    if( c == TIME_HEADER ) {       
      time_t pctime = 0;
      for(int i=0; i < TIME_MSG_LEN -1; i++){   
        c = Serial.read();          
        if( c >= '0' && c <= '9'){   
          pctime = (10 * pctime) + (c - '0') ; // convert digits to a number    
        }
      }   
      setTime(pctime);   // Sync Arduino clock to the time received on the serial port
    }  
  }
}

time_t requestSync()
{
  Serial.print(TIME_REQUEST);  
  return 0; // the time will be sent later in response to serial mesg
}