I you are going to create an AST tree, I think the simples way is to define a NonTerminal for time with custom AstNodeCreator method:
var timeLiteral = new NonTerminal("TimeLiteral", createTimeLiteral);
ntTime.Rule = Number + ":" + Number
In node creator method create a LiteralValueNode with appropriate time value computed from components.
You can go with custom terminal, but then you need to make sure regular Number literal has lower priority than your custom time terminal, so that time term gets the first chance to recognize the input. This looks a bit inefficient as all regular numbers
would have to be recognized twice - first by time terminal, and if it fails, regular Number terminal does the job.
Hope this explains it