Why doesn't the time update?
This statement:

static unsigned long timing=micros();


...only gives it an initial value.  It is not executed during loop.  These kinds of variables should be assigned an initial value in an executable section, perhaps when the alarm time is set.

This requires the definition to be pulled out, to the file scope:

static unsigned long timing;

void loop(){
    if (mode == 0) {//mode 0 is when the time should show
        timing=countTime(timing);


Here, the static keyword has a different meaning, although I usually use it to reduce the chances of colliding with other global variable names.

Make sure to give it an initial value in executable code somewhere:

void setup()
{
  ...
  timing = millis();  // Just once?  When the alarm is set?
}


... and update it as you do in countTime.

UPDATE  It's not clear from your snippet as to when the timing variable should be initialized, so I originally avoided addressing that.  If it is really initialized just once, at program startup, you can set it in setup.  Otherwise, it should be set when the initial timing value is finally known.