This may be a recent change (checked in 8.2 Update 4) - but the Sitecore API has an overload for the Sitecore.Context.SetLanguage method that should do what you want:
Notice the 4th argument of DateTime?
/// <summary>
/// Sets the current language for current request, and can persist it for given site for specified duration via cookie.
/// </summary>
/// <param name="language">The language to be set.</param>
/// <param name="persistent">if set to <c>true</c> persistent via cookie.</param>
/// <param name="expiryDate">The cookie expiry date. <c>null</c> for making cookie as 'session'.</param>
/// <param name="site">The site to have language set.</param>
public static void SetLanguage(Language language, bool persistent, SiteContext site, DateTime? expiryDate = null)
{
Assert.ArgumentNotNull((object) language, nameof (language));
Context.Items["sc_Language"] = (object) language;
if (!persistent || site == null)
return;
string cookieKey = site.GetCookieKey("lang");
if (!expiryDate.HasValue && !(WebUtil.GetCookieValue(cookieKey) != language.Name))
return;
WebUtil.SetCookieValue(cookieKey, language.Name, expiryDate ?? DateTime.MinValue);
}