DS3231 + button to trigger light
The else case is executed every time the other if and else if conditions are not true. That means if it is not 5 sec and not 30 sec and no button is pressed, the relay is switched off. 

To achieve what you want is not that easy, because you have to synchronize button press and button release with the timer actions. First you must specify what you exactly want to do. e.g What happens if you have already pressed the button and release it in the time interval between 30 and 5. Releasing the button would switch off the light but should it stay on because you are within the on-time? This is just an example of what to think about.

I wrote a little code for fun doing the things as I would do it: 

#include &lt;LiquidCrystal_I2C.h&gt; 
#include &lt;DS3231.h&gt;
LiquidCrystal_I2C lcd(0x27, 2, 1,0,4,5,6,7,3, POSITIVE);
DS3231  rtc( SDA, SCL );
Time t;

const int OnSec = 30;
const int OffSec = 5;
int relay_3 = 5;

int timerPhase = -1;
int relayState = LOW;

void setup() 
{ 
 lcd.begin( 20, 4 ); 
 rtc.begin();

 pinMode( relay_3, OUTPUT );                 
 pinMode( 8, INPUT_PULLUP );
}

void loop() 
{
  t = rtc.getTime( );

  int button_4 = digitalRead( 8 );

  lcd.setCursor( 0, 1 );
  lcd.print( rtc.getTimeStr( ) );

  // this only works if the off time is 
  // less than the on time. (OffSec &lt; OnSec)
  timerPhase = ( (t.sec &gt; OffSec) &amp;&amp; ( t.sec &lt; OnSec ) ) ? 0 : 1;

  if ( button_4 == HIGH )
  {
    // a button overrides the timer phase
    relayState = HIGH;   
  }
  else
  {
    if ( timerPhase == 0 )
    {
      relayState = LOW;
    } 
    else
    {
      relayState = HIGH;
    } 
  }

  digitalWrite( relay_3, relayState );

  lcd.clear();
}


I could not try the code because I don't know which libraries you used and therefor got compiler errors. So there might be syntax errors in my code but I hope I wrote correct code. It would be nice if you report errors here, if you find one/some ;-). 

The line 

timerPhase = ( (t.sec &gt; OffSec) &amp;&amp; ( t.sec &lt; OnSec ) ) ? 0 : 1;


uses a ternary operator. It means if the condition ( (t.sec &gt; OffSec) &amp;&amp; ( t.sec &lt; OnSec ) ) is true, take the first alternative 0 and assign it to the variable timerPhase, if it is false choose the second alternative '1'.