Welcome to the wonderfully confusing (even to those of us doing this for years) world of 'time'!
From my experience, if you are going to work with PHP/MySQL/etc. for very long, you will run into this 'issue' over and over. I will, therefore, give you the best advice I ever got about this - "whenever you are working with time, learn to work with and set everything to GMT on the server side - change it to the User's timezone when you display it." This way, you will save yourself a lot of stress as you work with users all over the world (and, if you stay in programming for long, you will!)
Now, why does your echo date() not output what you think it should?
See http://php.net/manual/en/function.date.php which states
The optional timestamp parameter is an integer Unix timestamp that defaults to the current local time if a timestamp is not given. In other words, it defaults to the value of time().
Note that "local time" means the time on the server where your php file is running - so, if it isn't in your local area, you won't get what you expect.....
Want to see what timezone your server is in?
$date = new DateTime();
$tz = $date->getTimezone();
echo $tz->getName();
To get the time you want from PHP:
$date = new DateTime(null, new DateTimeZone('Asia/Singapore'));
echo $date->format('Y-m-d H:i:s');
You also had tried date_default_timezone_set....
date_default_timezone_set is a PHP function, though your question says you want to use 'NOW()' in a database......
To set the database time, you need to use a command in the database - see this question for several examples of how that is done.
So, your question is quite multi-tiered (and typically won't get answered), though I know the confusion of just what you asked and I trust this response will help you get on your way to working with time.
EDIT: showing my results from a Google search of 'Singapore time' (left) and my server PHP code and result (right);
