ESP32 hal time
#include <esp32-hal.h>


setTimeZone configTime configTzTime getLocalTime
/*F********************************************************************
 Copyright 2015-2016 Espressif Systems ( Shanghai ) PTE LTD
 Licensed under the Apache License, Version 2.0 ( the "License" );
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
     http:www.apache.org/licenses/LICENSE-2.0
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
**********************************************************************/
#include "esp32-hal.h"
#include "lwip/apps/sntp.h"
//#include "tcpip_adapter.h"
#include "esp_netif.h"


/*F********************************************************************
*
**********************************************************************/
static void 
setTimeZone( long offset, int daylight )
{
	char cst[17] = {0};
	char cdt[17] = "DST";
	char tz[33] = {0};

	if( offset % 3600 ){
	sprintf( cst, "UTC%ld:%02u:%02u", offset / 3600, abs( ( offset % 3600 ) / 60 ), abs( offset % 60 ) );
	} else {
	sprintf( cst, "UTC%ld", offset / 3600 );
	}
	if( daylight != 3600 ){
	long tz_dst = offset - daylight;
	if( tz_dst % 3600 ){
	sprintf( cdt, "DST%ld:%02u:%02u", tz_dst / 3600, abs( ( tz_dst % 3600 ) / 60 ), abs( tz_dst % 60 ) );
	} else {
	sprintf( cdt, "DST%ld", tz_dst / 3600 );
	}
	}
	sprintf( tz, "%s%s", cst, cdt );
	setenv( "TZ", tz, 1 );
	tzset();
}

/*F********************************************************************
* configTime
Source: https://github.com/esp8266/Arduino/blob/master/cores/esp8266/time.c
**********************************************************************/
void 
configTime( long gmtOffset_sec, int daylightOffset_sec, const char* server1
	, const char* server2, const char* server3 )
{
	//tcpip_adapter_init();  // Should not hurt anything if already inited
	esp_netif_init();
	if( sntp_enabled() )
	{
	sntp_stop();
	}
	sntp_setoperatingmode( SNTP_OPMODE_POLL );
	sntp_setservername( 0, ( char* )server1 );
	sntp_setservername( 1, ( char* )server2 );
	sntp_setservername( 2, ( char* )server3 );
	sntp_init();
	setTimeZone( -gmtOffset_sec, daylightOffset_sec );
}

/*F********************************************************************
* configTzTime
sntp setup using TZ environment variable
**********************************************************************/
void 
configTzTime( const char* tz, const char* server1, const char* server2
	, const char* server3 )
{
	// tcpip_adapter_init();  // Should not hurt anything if already inited
	esp_netif_init();
	if( sntp_enabled() )
		sntp_stop();
	sntp_setoperatingmode( SNTP_OPMODE_POLL );
	sntp_setservername( 0, ( char* )server1 );
	sntp_setservername( 1, ( char* )server2 );
	sntp_setservername( 2, ( char* )server3 );
	sntp_init();
	setenv( "TZ", tz, 1 );
	tzset();
}

/*F********************************************************************
*
**********************************************************************/
bool 
getLocalTime( struct tm * info, uint32_t ms )
{
	uint32_t start = millis();
	time_t now;
	while( ( millis()-start ) <= ms ) 
	{
		time( &now );
		localtime_r( &now, info );
		if( info->tm_year > ( 2016 - 1900 ) )
			return true;
		delay( 10 );
	}
	return false;
}