Skip to content

Datetime input#13029

Merged
sfc-gh-aamadhavan merged 20 commits intodevelopfrom
aakarshm/date-time-input-1
Nov 20, 2025
Merged

Datetime input#13029
sfc-gh-aamadhavan merged 20 commits intodevelopfrom
aakarshm/date-time-input-1

Conversation

@sfc-gh-aamadhavan
Copy link
Copy Markdown
Contributor

@sfc-gh-aamadhavan sfc-gh-aamadhavan commented Nov 17, 2025

Describe your changes

  • Added backend support for st.datetime_input, including proto wiring, widget serde, AppTest bindings, and user-facing API.
  • Implemented the matching React widget, renderer hookup, and shared utilities so the datetime picker mirrors existing date/time widgets.
  • Expanded demo, typing tests, unit tests, and Playwright coverage to exercise initial values, callbacks, form/fragment usage, styling, and dynamic prop updates.
  • Needed to generate snapshots using python scripts/update_e2e_snapshots.py --changed
  • For different branches, re run make python-init
  • Code is modularized in the frontend to avoid cluttering the main input file.

Screenshot or video (only for visual changes)

DemoVideo.mov

GitHub Issue Link (if applicable)

Closes #6089

Testing Plan

  • Explanation of why no additional tests are needed
    The feature ships with dedicated Python unit tests, typing checks, frontend unit tests, and comprehensive Playwright coverage, so no further manual tests are required.

  • Unit Tests (JS and/or Python)

    • PYTHONPATH=lib pytest lib/tests/streamlit/elements/datetime_input_test.py
    • yarn test lib/src/components/widgets/DateTimeInput/DateTimeInput.test.tsx
  • E2E Tests

    • make run-e2e-test e2e_playwright/st_datetime_input_test.py (re-run after rebuilding the frontend)
  • Any manual testing needed?
    None beyond the automated suite.


Contribution License Agreement

By submitting this pull request you agree that all contributions to this project are made under the Apache 2.0 license.

@snyk-io
Copy link
Copy Markdown
Contributor

snyk-io bot commented Nov 17, 2025

Snyk checks have passed. No issues have been found so far.

Status Scanner Critical High Medium Low Total (0)
Open Source Security 0 0 0 0 0 issues
Licenses 0 0 0 0 0 issues

💻 Catch issues earlier using the plugins for VS Code, JetBrains IDEs, Visual Studio, and Eclipse.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Nov 17, 2025

✅ PR preview is ready!

Name Link
📦 Wheel file https://core-previews.s3-us-west-2.amazonaws.com/pr-13029/streamlit-1.51.0-py3-none-any.whl
📦 @streamlit/component-v2-lib Download from artifacts
🕹️ Preview app pr-13029.streamlit.app (☁️ Deploy here if not accessible)

@sfc-gh-aamadhavan sfc-gh-aamadhavan added security-assessment-completed impact:users PR changes affect end users flaky-verify If applied to PR will run flaky test verification workflow change:feature PR contains new feature or enhancement implementation labels Nov 17, 2025
@sfc-gh-aamadhavan sfc-gh-aamadhavan force-pushed the aakarshm/date-time-input-1 branch from 26407f5 to ffaed7f Compare November 17, 2025 23:06
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Nov 17, 2025

📈 Python coverage change detected

The Python unit test coverage has increased by 0.0574%

  • Current PR: 92.8428% (20399 statements, 1460 missed)
  • Latest develop: 92.7854% (20209 statements, 1458 missed)

🎉 Great job on improving test coverage!

Coverage by files
Name Stmts Miss Cover
streamlit/__init__.py 142 0 100%
streamlit/__main__.py 3 3 0%
streamlit/auth_util.py 100 25 75%
streamlit/cli_util.py 39 6 85%
streamlit/column_config.py 3 0 100%
streamlit/commands/__init__.py 0 0 100%
streamlit/commands/echo.py 54 11 80%
streamlit/commands/execution_control.py 59 10 83%
streamlit/commands/experimental_query_params.py 40 2 95%
streamlit/commands/logo.py 41 6 85%
streamlit/commands/navigation.py 106 2 98%
streamlit/commands/page_config.py 101 4 96%
streamlit/components/__init__.py 0 0 100%
streamlit/components/lib/__init__.py 0 0 100%
streamlit/components/lib/local_component_registry.py 35 2 94%
streamlit/components/types/__init__.py 0 0 100%
streamlit/components/types/base_component_registry.py 14 0 100%
streamlit/components/types/base_custom_component.py 49 6 88%
streamlit/components/v1/__init__.py 5 0 100%
streamlit/components/v1/component_arrow.py 33 8 76%
streamlit/components/v1/component_registry.py 41 3 93%
streamlit/components/v1/components.py 4 4 0%
streamlit/components/v1/custom_component.py 85 7 92%
streamlit/components/v2/__init__.py 24 0 100%
streamlit/components/v2/bidi_component/__init__.py 4 0 100%
streamlit/components/v2/bidi_component/constants.py 5 0 100%
streamlit/components/v2/bidi_component/main.py 109 12 89%
streamlit/components/v2/bidi_component/serialization.py 81 5 94%
streamlit/components/v2/bidi_component/state.py 13 0 100%
streamlit/components/v2/component_definition_resolver.py 30 0 100%
streamlit/components/v2/component_file_watcher.py 117 9 92%
streamlit/components/v2/component_manager.py 97 13 87%
streamlit/components/v2/component_manifest_handler.py 24 0 100%
streamlit/components/v2/component_path_utils.py 68 5 93%
streamlit/components/v2/component_registry.py 121 8 93%
streamlit/components/v2/get_bidi_component_manager.py 8 1 88%
streamlit/components/v2/manifest_scanner.py 224 25 89%
streamlit/components/v2/presentation.py 84 19 77%
streamlit/components/v2/types.py 8 8 0%
streamlit/config.py 412 12 97%
streamlit/config_option.py 79 3 96%
streamlit/config_util.py 288 7 98%
streamlit/connections/__init__.py 6 0 100%
streamlit/connections/base_connection.py 45 0 100%
streamlit/connections/snowflake_connection.py 60 13 78%
streamlit/connections/snowpark_connection.py 44 3 93%
streamlit/connections/sql_connection.py 56 6 89%
streamlit/connections/util.py 33 0 100%
streamlit/cursor.py 82 2 98%
streamlit/dataframe_util.py 501 47 91%
streamlit/delta_generator.py 208 6 97%
streamlit/delta_generator_singletons.py 70 4 94%
streamlit/deprecation_util.py 59 4 93%
streamlit/development.py 1 0 100%
streamlit/elements/__init__.py 0 0 100%
streamlit/elements/alert.py 60 0 100%
streamlit/elements/arrow.py 200 15 92%
streamlit/elements/balloons.py 10 0 100%
streamlit/elements/bokeh_chart.py 27 0 100%
streamlit/elements/code.py 20 1 95%
streamlit/elements/deck_gl_json_chart.py 104 10 90%
streamlit/elements/dialog_decorator.py 38 0 100%
streamlit/elements/doc_string.py 227 9 96%
streamlit/elements/empty.py 16 4 75%
streamlit/elements/exception.py 101 10 90%
streamlit/elements/form.py 54 2 96%
streamlit/elements/graphviz_chart.py 35 1 97%
streamlit/elements/heading.py 56 0 100%
streamlit/elements/html.py 49 0 100%
streamlit/elements/iframe.py 29 0 100%
streamlit/elements/image.py 32 0 100%
streamlit/elements/json.py 39 2 95%
streamlit/elements/layouts.py 140 3 98%
streamlit/elements/lib/__init__.py 0 0 100%
streamlit/elements/lib/built_in_chart_utils.py 387 26 93%
streamlit/elements/lib/color_util.py 100 4 96%
streamlit/elements/lib/column_config_utils.py 168 1 99%
streamlit/elements/lib/column_types.py 189 4 98%
streamlit/elements/lib/dialog.py 67 1 99%
streamlit/elements/lib/dicttools.py 39 2 95%
streamlit/elements/lib/file_uploader_utils.py 30 0 100%
streamlit/elements/lib/form_utils.py 26 0 100%
streamlit/elements/lib/image_utils.py 176 21 88%
streamlit/elements/lib/js_number.py 28 3 89%
streamlit/elements/lib/layout_utils.py 121 1 99%
streamlit/elements/lib/mutable_status_container.py 73 4 95%
streamlit/elements/lib/options_selector_utils.py 90 0 100%
streamlit/elements/lib/pandas_styler_utils.py 80 2 98%
streamlit/elements/lib/policies.py 56 1 98%
streamlit/elements/lib/streamlit_plotly_theme.py 49 0 100%
streamlit/elements/lib/subtitle_utils.py 76 13 83%
streamlit/elements/lib/utils.py 76 5 93%
streamlit/elements/map.py 110 1 99%
streamlit/elements/markdown.py 65 2 97%
streamlit/elements/media.py 181 8 96%
streamlit/elements/metric.py 91 0 100%
streamlit/elements/pdf.py 49 2 96%
streamlit/elements/plotly_chart.py 129 6 95%
streamlit/elements/progress.py 36 0 100%
streamlit/elements/pyplot.py 39 2 95%
streamlit/elements/snow.py 10 0 100%
streamlit/elements/space.py 12 0 100%
streamlit/elements/spinner.py 34 0 100%
streamlit/elements/text.py 16 0 100%
streamlit/elements/toast.py 26 0 100%
streamlit/elements/vega_charts.py 226 3 99%
streamlit/elements/widgets/__init__.py 0 0 100%
streamlit/elements/widgets/audio_input.py 68 10 85%
streamlit/elements/widgets/button.py 204 5 98%
streamlit/elements/widgets/button_group.py 161 1 99%
streamlit/elements/widgets/camera_input.py 62 10 84%
streamlit/elements/widgets/chat.py 195 54 72%
streamlit/elements/widgets/checkbox.py 52 0 100%
streamlit/elements/widgets/color_picker.py 59 2 97%
streamlit/elements/widgets/data_editor.py 245 14 94%
streamlit/elements/widgets/file_uploader.py 103 18 83%
streamlit/elements/widgets/multiselect.py 105 4 96%
streamlit/elements/widgets/number_input.py 143 5 97%
streamlit/elements/widgets/radio.py 83 5 94%
streamlit/elements/widgets/select_slider.py 97 0 100%
streamlit/elements/widgets/selectbox.py 91 2 98%
streamlit/elements/widgets/slider.py 241 8 97%
streamlit/elements/widgets/text_widgets.py 130 6 95%
streamlit/elements/widgets/time_widgets.py 390 19 95%
streamlit/elements/write.py 166 32 81%
streamlit/emojis.py 4 0 100%
streamlit/env_util.py 21 3 86%
streamlit/error_util.py 33 2 94%
streamlit/errors.py 191 25 87%
streamlit/external/__init__.py 0 0 100%
streamlit/external/langchain/__init__.py 2 0 100%
streamlit/external/langchain/streamlit_callback_handler.py 141 82 42%
streamlit/file_util.py 84 8 90%
streamlit/git_util.py 100 5 95%
streamlit/logger.py 54 0 100%
streamlit/material_icon_names.py 1 0 100%
streamlit/navigation/__init__.py 0 0 100%
streamlit/navigation/page.py 78 2 97%
streamlit/net_util.py 55 3 95%
streamlit/platform.py 10 1 90%
streamlit/runtime/__init__.py 8 0 100%
streamlit/runtime/app_session.py 460 91 80%
streamlit/runtime/caching/__init__.py 19 0 100%
streamlit/runtime/caching/cache_data_api.py 164 3 98%
streamlit/runtime/caching/cache_errors.py 45 4 91%
streamlit/runtime/caching/cache_resource_api.py 122 0 100%
streamlit/runtime/caching/cache_type.py 11 1 91%
streamlit/runtime/caching/cache_utils.py 165 9 95%
streamlit/runtime/caching/cached_message_replay.py 108 1 99%
streamlit/runtime/caching/hashing.py 311 25 92%
streamlit/runtime/caching/legacy_cache_api.py 14 0 100%
streamlit/runtime/caching/storage/__init__.py 2 0 100%
streamlit/runtime/caching/storage/cache_storage_protocol.py 31 2 94%
streamlit/runtime/caching/storage/dummy_cache_storage.py 21 0 100%
streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py 60 0 100%
streamlit/runtime/caching/storage/local_disk_cache_storage.py 86 4 95%
streamlit/runtime/connection_factory.py 85 9 89%
streamlit/runtime/context.py 140 0 100%
streamlit/runtime/context_util.py 18 0 100%
streamlit/runtime/credentials.py 139 4 97%
streamlit/runtime/download_data_util.py 27 0 100%
streamlit/runtime/forward_msg_cache.py 23 2 91%
streamlit/runtime/forward_msg_queue.py 63 4 94%
streamlit/runtime/fragment.py 112 2 98%
streamlit/runtime/media_file_manager.py 110 7 94%
streamlit/runtime/media_file_storage.py 15 0 100%
streamlit/runtime/memory_media_file_storage.py 68 0 100%
streamlit/runtime/memory_session_storage.py 15 0 100%
streamlit/runtime/memory_uploaded_file_manager.py 41 1 98%
streamlit/runtime/metrics_util.py 193 12 94%
streamlit/runtime/pages_manager.py 59 2 97%
streamlit/runtime/runtime.py 248 18 93%
streamlit/runtime/runtime_util.py 30 1 97%
streamlit/runtime/script_data.py 16 0 100%
streamlit/runtime/scriptrunner/__init__.py 5 0 100%
streamlit/runtime/scriptrunner/exec_code.py 49 5 90%
streamlit/runtime/scriptrunner/magic.py 83 1 99%
streamlit/runtime/scriptrunner/magic_funcs.py 10 1 90%
streamlit/runtime/scriptrunner/script_cache.py 27 0 100%
streamlit/runtime/scriptrunner/script_runner.py 230 27 88%
streamlit/runtime/scriptrunner_utils/__init__.py 0 0 100%
streamlit/runtime/scriptrunner_utils/exceptions.py 11 1 91%
streamlit/runtime/scriptrunner_utils/script_requests.py 106 5 95%
streamlit/runtime/scriptrunner_utils/script_run_context.py 135 2 99%
streamlit/runtime/secrets.py 242 26 89%
streamlit/runtime/session_manager.py 60 1 98%
streamlit/runtime/state/__init__.py 7 0 100%
streamlit/runtime/state/common.py 52 2 96%
streamlit/runtime/state/presentation.py 19 4 79%
streamlit/runtime/state/query_params.py 110 3 97%
streamlit/runtime/state/query_params_proxy.py 71 0 100%
streamlit/runtime/state/safe_session_state.py 77 9 88%
streamlit/runtime/state/session_state.py 433 29 93%
streamlit/runtime/state/session_state_proxy.py 62 8 87%
streamlit/runtime/state/widgets.py 15 1 93%
streamlit/runtime/stats.py 42 0 100%
streamlit/runtime/theme_util.py 46 1 98%
streamlit/runtime/uploaded_file_manager.py 39 3 92%
streamlit/runtime/websocket_session_manager.py 66 0 100%
streamlit/source_util.py 36 1 97%
streamlit/string_util.py 92 8 91%
streamlit/temporary_directory.py 18 1 94%
streamlit/testing/__init__.py 0 0 100%
streamlit/testing/v1/__init__.py 2 0 100%
streamlit/testing/v1/app_test.py 242 6 98%
streamlit/testing/v1/element_tree.py 1371 87 94%
streamlit/testing/v1/local_script_runner.py 71 2 97%
streamlit/testing/v1/util.py 17 0 100%
streamlit/time_util.py 28 1 96%
streamlit/type_util.py 138 12 91%
streamlit/url_util.py 39 5 87%
streamlit/user_info.py 87 8 91%
streamlit/util.py 38 1 97%
streamlit/version.py 3 0 100%
streamlit/watcher/__init__.py 3 0 100%
streamlit/watcher/event_based_path_watcher.py 181 24 87%
streamlit/watcher/folder_black_list.py 14 1 93%
streamlit/watcher/local_sources_watcher.py 127 9 93%
streamlit/watcher/path_watcher.py 43 3 93%
streamlit/watcher/polling_path_watcher.py 55 2 96%
streamlit/watcher/util.py 49 1 98%
streamlit/web/__init__.py 0 0 100%
streamlit/web/bootstrap.py 138 18 87%
streamlit/web/cache_storage_manager_config.py 5 0 100%
streamlit/web/cli.py 186 17 91%
streamlit/web/server/__init__.py 5 0 100%
streamlit/web/server/app_static_file_handler.py 29 3 90%
streamlit/web/server/authlib_tornado_integration.py 18 1 94%
streamlit/web/server/bidi_component_request_handler.py 65 8 88%
streamlit/web/server/browser_websocket_handler.py 115 31 73%
streamlit/web/server/component_file_utils.py 24 0 100%
streamlit/web/server/component_request_handler.py 55 4 93%
streamlit/web/server/media_file_handler.py 65 9 86%
streamlit/web/server/oauth_authlib_routes.py 118 18 85%
streamlit/web/server/oidc_mixin.py 44 0 100%
streamlit/web/server/routes.py 90 7 92%
streamlit/web/server/server.py 188 11 94%
streamlit/web/server/server_util.py 67 5 93%
streamlit/web/server/stats_request_handler.py 53 4 92%
streamlit/web/server/upload_file_request_handler.py 59 14 76%
streamlit/web/server/websocket_headers.py 19 1 95%
TOTAL 20399 1460 93%

📊 View detailed coverage comparison

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Nov 17, 2025

📈 Frontend coverage change detected

The frontend unit test (vitest) coverage has increased by 0.1100%

  • Current PR: 86.1200% (51337 lines, 7125 missed)
  • Latest develop: 86.0100% (50782 lines, 7104 missed)

🎉 Great job on improving test coverage!

📊 View detailed coverage comparison

@sfc-gh-aamadhavan sfc-gh-aamadhavan force-pushed the aakarshm/date-time-input-1 branch from ffaed7f to bdcf326 Compare November 17, 2025 23:26
@sfc-gh-aamadhavan sfc-gh-aamadhavan marked this pull request as ready for review November 18, 2025 01:17
@sfc-gh-aamadhavan sfc-gh-aamadhavan requested a review from a team as a code owner November 18, 2025 01:17
@sfc-gh-aamadhavan sfc-gh-aamadhavan force-pushed the aakarshm/date-time-input-1 branch from 80ab119 to 12fd2db Compare November 18, 2025 04:20
@sfc-gh-aamadhavan sfc-gh-aamadhavan force-pushed the aakarshm/date-time-input-1 branch from 4432fa3 to 7ea5e4d Compare November 18, 2025 17:28
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR implements a new st.datetime_input widget that allows users to select both date and time values. The implementation follows Streamlit's established patterns for widget creation, including full backend support, React frontend component, protobuf message definitions, and comprehensive test coverage across Python unit tests, TypeScript unit tests, and Playwright E2E tests.

Key changes:

  • New datetime picker widget combining date and time selection with configurable step intervals and format options
  • Backend support for various input types (datetime, date, time, ISO strings, "now" keyword)
  • AppTest integration for programmatic testing
  • Visual snapshot testing across multiple browsers and themes

Reviewed Changes

Copilot reviewed 17 out of 95 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
proto/streamlit/proto/DateTimeInput.proto Defines protobuf message structure for datetime widget communication
proto/streamlit/proto/Element.proto Integrates DateTimeInput into Element union
lib/streamlit/elements/widgets/time_widgets.py Core backend implementation with value parsing, validation, and widget registration
lib/streamlit/__init__.py Exports datetime_input to public API
lib/streamlit/testing/v1/element_tree.py AppTest support for DateTimeInput widget
lib/streamlit/testing/v1/app_test.py Exposes datetime_input property in AppTest
lib/tests/streamlit/typing/datetime_input_types.py Type checking tests for public API
lib/tests/streamlit/elements/datetime_input_test.py Python unit tests for backend logic
lib/tests/streamlit/element_mocks.py Test helper registration
lib/tests/streamlit/delta_generator_test.py Duplicate widget ID test coverage
frontend/lib/src/components/widgets/DateTimeInput/DateTimeInput.tsx React component implementation
frontend/lib/src/components/widgets/DateTimeInput/DateTimeInput.test.tsx Frontend unit tests
frontend/lib/src/components/widgets/DateTimeInput/index.ts Component export
frontend/lib/src/components/core/Block/ElementNodeRenderer.tsx Renderer integration
e2e_playwright/st_datetime_input.py Test application demonstrating widget features
e2e_playwright/st_datetime_input_test.py E2E test suite
e2e_playwright/shared/app_utils.py Test utility for locating datetime inputs
e2e_playwright/__snapshots__/ Visual regression test snapshots (multiple PNG files)

Copy link
Copy Markdown
Collaborator

@sfc-gh-bnisco sfc-gh-bnisco left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this PR! I've left some comments inline, let me know if you want to chat about any of them.

@sfc-gh-aamadhavan sfc-gh-aamadhavan added flaky-verify If applied to PR will run flaky test verification workflow and removed flaky-verify If applied to PR will run flaky test verification workflow labels Nov 18, 2025
@sfc-gh-aamadhavan sfc-gh-aamadhavan force-pushed the aakarshm/date-time-input-1 branch from eb5f736 to b8c0e10 Compare November 20, 2025 00:07
@sfc-gh-aamadhavan
Copy link
Copy Markdown
Contributor Author

On timezones: Seems like that the timezone of timezone-aware objects just gets stripped out (at least for value) and st.datatime_input always returns an object without timezone. I guess this is an ok way of handling this, but I think it would be good to add some info to the docstring (e.g. value) that timezone information gets ignored and that it always returns a timezone-naive object and maybe even a test with different timezones to ensure this behaviour stays stable.

How do we currently handle timezone-aware objects in st.date_input and st.time_input? I think ideally we should just handle them in the same way here.

Yeah it handles them the same way, basically strips the timezones (also documented)

"""Test interactions with an empty datetime_input widget."""

def script():
import streamlit as st
def script():
from datetime import datetime

import streamlit as st
def script():
from datetime import datetime

import streamlit as st
def script():
from datetime import datetime

import streamlit as st
@jrieke
Copy link
Copy Markdown
Collaborator

jrieke commented Nov 20, 2025

I think timezones only really matter for datetime. date and time objects in python don't support timezones.

Time can apparently have a timezone attached to it (even though it's not very useful). @sfc-gh-aamadhavan can you check what st.time_input does when you put in a time object with a timezone?

Comment on lines +1059 to +1069
if not isinstance(step, (int, timedelta)):
raise StreamlitAPIException(
f"`step` can only be `int` or `timedelta` but {type(step)} is provided."
)
step_seconds = (
int(step.total_seconds()) if isinstance(step, timedelta) else step
)
if step_seconds < 60 or step_seconds > timedelta(hours=23).seconds:
raise StreamlitAPIException(
f"`step` must be between 60 seconds and 23 hours but is currently set to {step_seconds} seconds."
)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The step validation logic should include an explicit check for negative values. Currently, a negative step value could pass the validation if it's less than -timedelta(hours=23).seconds, which would create unexpected behavior. Consider adding a simple check like if step_seconds <= 0: before the existing range check to ensure only positive step values are accepted.

Suggested change
if not isinstance(step, (int, timedelta)):
raise StreamlitAPIException(
f"`step` can only be `int` or `timedelta` but {type(step)} is provided."
)
step_seconds = (
int(step.total_seconds()) if isinstance(step, timedelta) else step
)
if step_seconds < 60 or step_seconds > timedelta(hours=23).seconds:
raise StreamlitAPIException(
f"`step` must be between 60 seconds and 23 hours but is currently set to {step_seconds} seconds."
)
if not isinstance(step, (int, timedelta)):
raise StreamlitAPIException(
f"`step` can only be `int` or `timedelta` but {type(step)} is provided."
)
step_seconds = (
int(step.total_seconds()) if isinstance(step, timedelta) else step
)
if step_seconds <= 0:
raise StreamlitAPIException(
f"`step` must be a positive value but is currently set to {step_seconds} seconds."
)
if step_seconds < 60 or step_seconds > timedelta(hours=23).seconds:
raise StreamlitAPIException(
f"`step` must be between 60 seconds and 23 hours but is currently set to {step_seconds} seconds."
)

Spotted by Graphite Agent

Fix in Graphite


Is this helpful? React 👍 or 👎 to let us know.

def script():
from datetime import datetime

import streamlit as st
@sfc-gh-aamadhavan sfc-gh-aamadhavan removed the request for review from sfc-gh-bnisco November 20, 2025 01:18
@sfc-gh-aamadhavan
Copy link
Copy Markdown
Contributor Author

I think timezones only really matter for datetime. date and time objects in python don't support timezones.

Time can apparently have a timezone attached to it (even though it's not very useful). @sfc-gh-aamadhavan can you check what st.time_input does when you put in a time object with a timezone?

Yeah I checked and replied above before about it, it is just ignored, which is the same behaviour as this.

@jrieke
Copy link
Copy Markdown
Collaborator

jrieke commented Nov 20, 2025

Ok great then good to go, thx for checking!

@sfc-gh-aamadhavan sfc-gh-aamadhavan enabled auto-merge (squash) November 20, 2025 03:44
@sfc-gh-aamadhavan sfc-gh-aamadhavan merged commit a82127e into develop Nov 20, 2025
41 checks passed
@sfc-gh-aamadhavan sfc-gh-aamadhavan deleted the aakarshm/date-time-input-1 branch November 20, 2025 04:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

change:feature PR contains new feature or enhancement implementation flaky-verify If applied to PR will run flaky test verification workflow impact:users PR changes affect end users

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add datetime input

6 participants