View:
<div class="container">
    <div class="row">
        <div class="col-md-3">
        </div>
        <div class="col-md-6">
        <form method="post" action="<?php echo base_url();?>account/register">
        <?php $form_error = $this->session->flashdata('error'); ?>
          <div class="form-group">
            <label for="username">Username</label>
            <input class="form-control" id="username" name="username" type="input">
            <div id="form_error"><?php echo $form_error['username']; ?></div>
          </div>
          <div class="form-group">
            <label for="password">Password</label>
            <input class="form-control" id="password" name="password" type="password">
            <div id="form_error"><?php echo $form_error['password']; ?></div>
          </div>
          <div class="form-group">
            <label for="confirm_password">Confirm Password</label>
            <input class="form-control" id="confirm_password" name="confirm_password" type="password">
          <div id="form_error"><?php echo $form_error['confirm_password']; ?></div>
          </div>
          <div class="form-group">
            <label for="gender">Gender</label>
            <select class="form-control" id="gender" name="gender">
                <option disabled selected value="">select a gender</option>
                <option value="Male">Male</option>
                <option value="Female">Female</option>
                <option value="Other">Other</option>
            </select>
            <div id="form_error"><?php echo $form_error['gender']; ?></div>
          </div>
          <div class="form-group">
            <label for="birthdate">Birthdate</label>
            <input class="form-control" id="birthdate" name="birthdate" type="date">
            <div id="form_error"><?php echo $form_error['birthdate']; ?></div>
          </div>
          <button type="submit" class="btn btn-primary btn-block">Submit</button>
        </form>
        <div class="text-center">
        <a class="d-block small mt-3" href="<?php echo base_url();?>pages/login_user">Already have an account?</a>
        </div>
        </div>
        <div class="col-md-3">
        </div>
    </div>
</div>
</body>
Account Controller:
public function register(){
$this->form_validation->set_rules('username', 'Username', 'trim|required|is_unique[users.username]');
$this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[8]|max_length[20]');
$this->form_validation->set_rules('confirm_password', 'Confirm Password', 'trim|required|matches[password]');
$this->form_validation->set_rules('gender', 'Gender', 'trim|required|in_list[Male,Female,Other]');
$this->form_validation->set_rules('birthdate', 'Birthdate', 'trim|required|valid_date');
if($this->form_validation->run() == FALSE){
$form_error = array('username' => form_error('username'),
        'password' => form_error('password'),
        'confirm_password' => form_error('confirm_password'),
        'gender' => form_error('gender'),
        'birthdate' => form_error('birthdate'));
$this->session->set_flashdata('error', $form_error);
redirect('pages/register_user');
}else{ 
$data = array('username' => $this->input->post('username'),
            'password' => password_hash($this->input->post('password'),PASSWORD_BCRYPT),
            'gender' => $this->input->post('gender'),
            'birthdate' => $this->input->post('birthdate'),
            'date_created' => mdate('%Y-%m-%d',time()),
            'last_login' => mdate('%Y-%m-%d',time()));
if($this->account_model->create_account($data)){
$this->session->set_flashdata('message','Registration Successful');
redirect('pages/login_user');
}else{
$this->session->set_flashdata('message','Registration Failed');
redirect('pages/register_user');}}
}
//form_validation callback
public function valid_date($birthdate){
    echo 'aw';
if(date('YYYY-MM-DD',strtotime($birthdate))){
return TRUE; }else{
    echo $birthdate;
$this->form_validation->set_message('valid_date', 'Invalid Birthdate');
$form_error['birthdate'] = form_error('valid_date');
$this->session->set_flashdata('error',$form_error);
return FALSE; }
}
Pages Controller:
public function login_user(){
    $data['title'] = 'Login';
    $this->load->view('template/header',$data);
    $this->load->view('template/navbar');
    $this->load->view('pages/login');
    $this->load->view('template/footer');
    }
    public function register_user(){
    $data['title'] = 'Register';
    $this->load->view('template/header',$data);
    $this->load->view('template/navbar');
    $this->load->view('pages/registration');
    $this->load->view('template/footer');
    }
I tried setting flashdata inside the callback function but this is my first time using a callback function to check the validity of the birthdate given. I tested out the input and you can't input any alphabets but you can go over the maximum length. For example the format should be 'YYYY-MM-DD' you can input something like this: 555555-55-55.
All my other error prints out successfully but the valid_date callback function prints an error:
Unable to access an error message corresponding to your field name Birthdate.(valid_date)
If what i'm asking for is impossible/wrong then i'll just add a min_length[10] and max_length[10] and just edit its error to 'invalid date'.
EDIT: Taking inspiration from my statement above about the max and min length, i also added a custom error for the valid_date there and what do you know it works.
Heres my updated controller:
public function register(){
    $this->form_validation->set_rules('username', 'Username', 'trim|required|is_unique[users.username]');
    $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[8]|max_length[20]');
    $this->form_validation->set_rules('confirm_password', 'Confirm Password', 'trim|required|matches[password]');
    $this->form_validation->set_rules('gender', 'Gender', 'trim|required|in_list[Male,Female,Other]');
    $this->form_validation->set_rules('birthdate', 'Birthdate', 'trim|required|valid_date',
    array('valid_date' => 'Invalid Date of birth'));
    if($this->form_validation->run() == FALSE){
    $form_error = array('username' => form_error('username'),
            'password' => form_error('password'),
            'confirm_password' => form_error('confirm_password'),
            'gender' => form_error('gender'),
            'birthdate' => form_error('birthdate'));
    $this->session->set_flashdata('error', $form_error);
    redirect('pages/register_user');
    }else{ 
    $data = array('username' => $this->input->post('username'),
                'password' => password_hash($this->input->post('password'),PASSWORD_BCRYPT),
                'gender' => $this->input->post('gender'),
                'birthdate' => $this->input->post('birthdate'),
                'date_created' => mdate('%Y-%m-%d',time()),
                'last_login' => mdate('%Y-%m-%d',time()));
    if($this->account_model->create_account($data)){
    $this->session->set_flashdata('message','Registration Successful');
    redirect('pages/login_user');
    }else{
    $this->session->set_flashdata('message','Registration Failed');
    redirect('pages/register_user');}}
    }
    //form_validation callback
    public function valid_date($birthdate){
    if(date('YYYY-MM-DD',strtotime($birthdate))){
    return TRUE; }else{return FALSE; }
    }
I'm still not sure if it really works or just by fluke.